代码之家  ›  专栏  ›  技术社区  ›  aabujamra

在包含内容不一致的行的dataframe列中应用函数

  •  1
  • aabujamra  · 技术社区  · 6 年前

    我有这个数据框:

          data          
    0   [dic_inside_list_1]
    1   [dic_inside_list_2]  
    ...
    

    哪里:

    dic_inside_list_1 = [{'tipo': 'ATIVA', 'nome': 'GABRIEL FRANCISCO DA CUNHA', 'advogado': False, 'advogados': [{'tipo': 'ADVOGADO_PARTE_ATIVA', 'nome': 'PATRICIA DE SIQUEIRA MANOEL DUARTE', 'advogado': True}]}]
    
    dic_inside_list_2 = [{'tipo': 'ATIVA', 'nome': 'JOSÉ FRANCISCO DE OLIVEIRA', 'advogado': False, 'advogados': [{'tipo': 'ADVOGADO_PARTE_ATIVA', 'nome': 'JULIO TORSO ALCANTARA', 'advogado': True}]}, {'tipo': 'PASSIVA', 'nome': 'INDUSTRIAS MENTEN DE CARTONAGEM LTDA', 'advogado': False, 'advogados': []}]
    

    我想创建两个新列:“parte_passiva”和“parte_ativa” “parte_ativa”从“tipo”为“ativa”的字典中获取“nome” “parte_passia”从“tipo”为“passia”的字典中获取“nome”

    所以应该是这样的:

                       data                    parte_ativa             parte_passiva
    0   [dic_inside_list_1]   'GABRIEL FRANCISCO DA CUNHA'     
    1   [dic_inside_list_2]   'JOSÉ FRANCISCO DE OLIVEIRA'    'INDUSTRIAS MENTEN DE CARTONAGEM LTDA'
    ...
    

    以下代码适用于“parte_ativa”,因为这两个词典都有:

    df['parte_ativa']=df['data'].apply(lambda x: x[0]['nome'] if x[0]['tipo']=='ATIVA' else x)
    

    但是当我试图把它应用到被动的一方时 df['parte_passiva']=df['data'].apply(lambda x: x[1]['nome'] if x[1]['tipo']=='PASSIVA' else x) 它会引发一个错误,因为并非所有行都有 'tipo' == 'PASSIVA'

    IndexError: list index out of range
    

    有人对此有什么建议吗? 我知道不可能在lambda里面放一个try语句。有没有办法使用if语句来防止这种情况发生?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Eme Eme    6 年前

    你的错误发生在它试图 x[1] 是的。不是所有的行都有两行的长度。 dic_inside_list_2[1] 给出 IndexError 是的。

    如果您的数据是长度为1或2的列表(仅),并且您正在检查 'tipo'=='PASSIVA' 只有在 十[1] ,您可以使用:

    df['parte_passiva']=df['data'].apply(
        lambda x: x[-1]['nome'] if x[-1].get('tipo', None)=='PASSIVA' else None)
    

    如果您的数据是可变长度的列表,但您仍在检查 'tipo'='被动' 只有在 十[1] ,您可以使用:

    df['parte_passiva']=df['data'].apply(
        lambda x: x[min(len(x)-1,1)]['nome'] if x[min(len(x)-1,1)].get('tipo', None)=='PASSIVA' else None)
    

    我用过 x[-1].get('tipo', None) 为了避免 KeyError 如果 'tipo' 字典里没有,但是 x[-1]['tipo'] 很好。