Как добавлять списки с помощью groupby? ValueError: функция не уменьшает - PullRequest
1 голос
/ 19 июня 2020

У меня есть следующий фрейм данных:

df=pd.DataFrame({'code1':["A","B","A"],"code2":["k","l","k"],'Names':[['EUGENIO NETO','JUAN MATIAS SERAGOPIAN'],['EUGENIO LUPORINI NETO'],['SIMONE FANKHAUSER','ALEX SOUZA']]})

  code1 code2                                   Names
0     A     k  [EUGENIO NETO, JUAN MATIAS SERAGOPIAN]
1     B     l                 [EUGENIO LUPORINI NETO]
2     A     k         [SIMONE FANKHAUSER, ALEX SOUZA]

Я хочу сгруппировать по code1 и code2 и объединить списки в Names. В некотором смысле это выглядит так:

  code1 code2  Names
0     A     k  [EUGENIO NETO, JUAN MATIAS SERAGOPIAN, SIMONE FANKHAUSER, ALEX SOUZA]
1     B     l  [EUGENIO LUPORINI NETO]

Уже проверены следующие ответы:

Группировать и добавлять списки и строки

pandas списки группировки и объединения

Итак, я попытался адаптировать ответы на эти вопросы к моему случаю (но не смог решить):

df['Names']=df[['code1','code2',"Names"]].groupby(['code1','code2'])["Names"].agg('sum')
----> ValueError: Function does not reduce

df['Names']=df[['code1','code2',"Names"]].groupby(['code1','code2'])["Names"].agg('Names')
----> AttributeError: 'SeriesGroupBy' object has no attribute 'Names'

df['Names']=df[['code1','code2',"Names"]].groupby(['code1','code2'])["Names"].transform(lambda x: append(x))
----> NameError: name 'append' is not defined

Я что-то упустил или это неправильно?

EDIT

Андрей и NY C Coder действительно предложили функциональные решения. Но когда я запустил это в большем наборе данных, я получил то же ValueError: Function does not reduce. Исследовал, что это могло быть, и нашел здесь этот вопрос: Pandas Функция группового аггирования не уменьшает

В выбранном ответе предлагается использовать кортежи, поскольку списки проблематичны c. Другой ответ объясняет, где это происходит в коде pandas. Кортежи были бы лучшим способом? Как применить это здесь?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Это должно сработать:

df['Names'] = df['Names'].agg(lambda x: ','.join(map(str, x)))
df = df.groupby(by=['code1', 'code2'], as_index=False).agg('sum')
print(df)



  code1 code2                                              Names
0     A     k  EUGENIO NETO,JUAN MATIAS SERAGOPIANSIMONE FANK...
1     B     l                              EUGENIO LUPORINI NETO
1 голос
/ 19 июня 2020
print( df.groupby(['code1', 'code2'], as_index=False).agg('sum') )

Печать:

  code1 code2                                              Names
0     A     k  [EUGENIO NETO, JUAN MATIAS SERAGOPIAN, SIMONE ...
1     B     l                            [EUGENIO LUPORINI NETO]

РЕДАКТИРОВАТЬ: Решение с itertools.chain:

from itertools import chain

df=pd.DataFrame({'code1':["A","B","A"],"code2":["k","l","k"],'Names':[['EUGENIO NETO','JUAN MATIAS SERAGOPIAN'],['EUGENIO LUPORINI NETO'],['SIMONE FANKHAUSER','ALEX SOUZA']]})
print( df.groupby(['code1', 'code2'], as_index=False).agg(lambda x: list(chain.from_iterable(x))) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...