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
    则必须返回my
    resp

  • 如果
    bool3_res['detected']==bool2_res['is_doc1']==True
    则必须返回my
    resp
    \

  • 3:否则返回“无效”

    数据帧

    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);如果是这样,请引发ValueError

  • 检查bool1的is_doc1是否为真,如果不是,则检查bool2的is_doc1是否为真

  • 如果两者都不正确,则引发
    ValueError

  • 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'
    的值位于该位置?