首页 > 解决方案 > 在内容不一致的行中应用数据框列中的函数

问题描述

我有这个数据框:

      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”的字典中获取“nome”,因为“ATIVA”“parte_passiva”正在从具有“tipo”的字典中获取“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)

但是,当我尝试将其应用于 parte_passivadf['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 语句来防止这种情况发生?

标签: pythonpandasdictionarylambda

解决方案


当它试图做你的错误发生x[1]。并非所有行的长度都是 2。dic_inside_list_2[1]给出IndexError.

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

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

如果您的数据是可变长度的列表,但您仍然'tipo'=='PASSIVA'只检查 at x[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)避免字典中没有KeyErrorif 'tipo',但x[-1]['tipo']很好。


推荐阅读