Применение функции в столбце dataframe со строками, имеющими несовместимое содержимое - PullRequest
0 голосов
/ 26 июня 2018

У меня есть этот фрейм данных:

      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» получает «nome»"из словаря, в котором" tipo "означает" ATIVA "," parte_passiva "получает" nome "из словаря, в котором" tipo "означает" PASSIVA "

Так что это должно выглядеть так:

                   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

У кого-нибудь есть предложения по этому поводу?Я знаю, что внутри лямбда-выражения нельзя ввести пробное предложение.Есть ли способ использовать предложения, чтобы этого не происходило?

1 Ответ

0 голосов
/ 26 июня 2018

Ваша ошибка возникает при попытке сделать 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'] в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...