我有这个数据框:
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_passiva”正在从具有“ tipo”作为“ PASSIVA”的字典中获取“ 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_passiva 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语句。句子是否可以防止这种情况的发生?
答案 0 :(得分:2)
您的错误尝试执行x[1]
时发生。并非您所有的行都有两个长度。 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'
处检查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)
,我用KeyError
来避免'tipo'
,但是x[-1]['tipo']
很好。