Python 如何应用if条件并应用于数据帧
需要检查Python 如何应用if条件并应用于数据帧,python,pandas,Python,Pandas,需要检查bool3_res的'detected'键以及bool_res的is_doc1和bool_2res 如果bool3_res['detected']==bool1_res['is_doc1']==True则必须返回myresp 如果bool3_res['detected']==bool2_res['is_doc1']==True则必须返回myresp\ 3:否则返回“无效” 数据帧 user_uid,bool1,bool2,bool3,bool1_res,bool2_res,bool3_r
bool3_res
的'detected'
键以及bool_res
的is_doc1
和bool_2
res
bool3_res['detected']==bool1_res['is_doc1']==True
则必须返回myresp
bool3_res['detected']==bool2_res['is_doc1']==True
则必须返回myresp
\user_uid,bool1,bool2,bool3,bool1_res,bool2_res,bool3_res
1001,27452.webp,981.webp,d92e.webp,"{'is_doc1': False, 'is_doc2': True}","{'is_doc1': True, 'is_doc2': True}","{'detected': True, 'count': 1}"
1002,27452.webp,981.webp,d92e.webp,"{'is_doc1': True, 'is_doc2': True}","{'is_doc1': False, 'is_doc2': True}","{'detected': True, 'count': 1}"
我的代码
def new_func(x):
d1 = df['bool1_res'].to_dict()
d1 = eval(d1[0])
d2 = df['bool2_res'].to_dict()
d2 = eval(d2[0])
d3 = df['bool3_res'].to_dict()
d3 = eval(d3[0])
if d1['is_doc1'] == d3['detected'] == True:
resp = {
"task_id": "uid",
"group_id": "uid",
"data": {
"document1": df['bool1'],
"document2": df['bool3']
}
}
elif d2['is_doc1'] == d3['detected'] == True:
resp = {
"task_id": "user_uid",
"group_id": "uid",
"data": {
"document1": df['bool2'],
"document2": df['bool3']
}
}
elif d3['detected'] == False:
resp = 'Not valid'
else:
resp = 'Not valid'
return resp
df['new'] = df.apply(new_func, axis = 1)
#df['new'] = df[['bool1', 'bool2', 'bool3', 'bool1_res', 'bool2_res', 'bool3_res']].applymap(new_func)
我的预期出局了
df['新']
{'u_id': 'uid', 'group': 'uid', 'data': {'document1': ['981.webp'], 'document2': {'d92e.webp'}}}"
{'u_id': 'uid', 'group': 'uid', 'data': {'document1': ['27452.webp'], 'document2': {'d92e.webp'}}}"
0 {'task_id': 'user_uid', 'group_id': 'uid', 'data': {'document1': ['981.webp', '981.webp'], 'document2': ['d92e.webp', 'd92e.webp']}}
1 {'task_id': 'user_uid', 'group_id': 'uid', 'data': {'document1': ['981.webp', '981.webp'], 'document2': ['d92e.webp', 'd92e.webp']}}
Name: new, dtype: object
我的
df['新']
0 {'task_id': 'user_uid', 'group_id': 'uid', 'data': {'document1': ['981.webp', '981.webp'], 'document2': ['d92e.webp', 'd92e.webp']}}
1 {'task_id': 'user_uid', 'group_id': 'uid', 'data': {'document1': ['981.webp', '981.webp'], 'document2': ['d92e.webp', 'd92e.webp']}}
Name: new, dtype: object
您应该避免使用x
而不是df
来处理每行,对于一个元素列表,将[]
添加到x['bool1']
,x['bool2']
和x['bool3']
:
import ast
def new_func(x):
d1 = ast.literal_eval(x['bool1_res'])
d2 = ast.literal_eval(x['bool2_res'])
d3 = ast.literal_eval(x['bool3_res'])
if d1['is_doc1'] == d3['detected'] == True:
resp = {
"task_id": "uid",
"group_id": "uid",
"data": {
"document1": [x['bool1']],
"document2": [x['bool3']]
}
}
elif d2['is_doc1'] == d3['detected'] == True:
resp = {
"task_id": "user_uid",
"group_id": "uid",
"data": {
"document1": [x['bool2']],
"document2": [x['bool3']]
}
}
elif d3['detected'] == False:
resp = 'Not valid'
else:
resp = 'Not valid'
return resp
df['new'] = df.apply(new_func, axis = 1)
我假设这就是扩展代码行后数据的样子:(而且,如果您只需添加一些空格,阅读起来会容易得多…^ u^)
df=pd.DataFrame(
[
[1001,“27452.webp”,“981.webp”,“d92e.webp”,
“{'is_doc1':False,'is_doc2':True}”,
“{'is_doc1':True,'is_doc2':True}”,
{'detected':True,'count':1}
],
[1002,“27452.webp”,“981.webp”,“d92e.webp”,
“{'is_doc1':True,'is_doc2':True}”,
“{'is_doc1':False,'is_doc2':True}”,
{'detected':True,'count':1}
],
[1003,“27452.webp”,“981.webp”,“d92e.webp”,
“{'is_doc1':True,'is_doc2':True}”,
“{'is_doc1':False,'is_doc2':True}”,
{'detected':False,'count':1}
],
],
列=['user\u uid'、'bool1'、'bool2'、'bool3'、'bool1\u res'、'bool2\u res',
“bool3_res”
]
)
我的回答
执行分为两部分:(1)解析字符串和(2)处理/生成“新”列值
#必需的软件包
导入ast
作为pd进口熊猫
#关于类型建议
从输入任何
第1部分:解析dict字符串
此函数通过应用于数据帧中的每个元素,并使用@jezrael正确建议的ast.literal\u eval
def str2dict(x:Any):
“(步骤1)使用ast.literal\u eval解析参数”
尝试:
x=ast.literal_eval(x.strip())
#如果x不可解析,则按原样返回x
除ValueError为e外:
通过
最后:
返回x
第2部分:处理数据(即制作“新”列)
此函数应用于数据帧的每一行(通过):
根据您发布的函数中的逻辑,我:
bool3['detected']
是否为False(前两个条件都已检测到==True);如果是这样,请引发ValueErrorValueError
def make_newcol_条目(x:pd.系列):
“”(步骤2)为熊猫组构造“新”列值“”
尝试:
如果x.bool3_res['detected']为假:
升值误差
#检查is_doc1属性
elif x.bool1_res['is_doc1']为真:
document1=x.bool1
elif x.bool2_res['is_doc1']为真:
document1=x.bool2
其他:
升值误差
除值错误外:
entry=“无效”
通过
#如果有'is_doc1'是真的,那么构造您的条目。
其他:
条目={
“任务id”:“uid”,
“组id”:“uid”,
“数据”:{“document1”:document1,“document2”:x.bool3}
}
返回条目
要执行,请运行:
df=df.assign(new=lambda x:x.applymap(str2dict)\
.agg(生成新的列项,轴=1))
请注意,这将解析数据帧中的所有元素
要仅解析bool\u res
列,可以分两步执行:
#选择并仅解析res cols('bool#u res'),然后应用
df.update(df.filter(regex=r''u res$',axis=1.applymap(str2dict))
df=df.assign(lambda x:x.agg(应用make\u newcol\u条目,轴=1))
结果
$df
用户uid bool1 bool2 bool3 bool1\u res bool2\u res bool3\u res new
0 1001 27452.webp 981.webp d92e.webp{'is_doc1':False,'is_doc2':True}{'is_doc1':True,'is_doc2':True}{'detected':True,'count':1}{'task_id':'uid','group_id':'uid','data':{'document1':'981.webp','document2':'d92e.webp'}
1 1002 27452.webp 981.webp d92e.webp{'is_doc1':True,'is_doc2':True}{'is_doc1':False,'is_doc2':True}{'detected':True,'count':1}{'task_id':'uid','group_id':'uid','data':{'document1':'27452.webp','document2':'d92e.webp'}
2 1003 27452.webp 981.webp d92e.webp{'is_doc1':True,'is_doc2':True}{'is_doc1':False,'is_doc2':True}{'detected':False,'count':1}无效
$df['new']
0{'task_id':'uid','group_id':'uid','data':{'document1':'981.webp','document2':'d92e.webp'}
1{'task_id':'uid','group_id':'uid','data':{'document1':'27452.webp','document2':'d92e.webp'}
2无效
名称:新建,数据类型:对象
不要为此使用eval()
。请分享所有相关代码和数据。请参阅:。你看过熊猫的文件了吗?为什么要将字典存储在数据帧中?@AMC它是必需的,只需执行代码,我有一些小的可复制代码正在工作。这是一个api响应,需要另存为数据帧。我不确定您所说的“需要”是什么意思,请执行代码。@cdac您的预期输出显示一个键'u\u id'
,代码中没有提到它。此外,程序输出显示的是“任务id”
。您希望'uid'
是什么?它应该只是一个固定的字符串,还是您希望'user\u id'
的值位于该位置?