Преобразование groupby в список в pandas не работает - PullRequest
1 голос
/ 18 июня 2020

Лучше всего описано на примере

import pandas as pd

df = pd.DataFrame({
  'a'   : ['A','B','C','A','B','C','A','B','C'],
  'b': [1,2,3,4,5,6,7,8,9]}
)

И я хочу создать столбец, содержащий в list элементы столбца b по группе столбцов a

в результате получается следующее

   a    b      c
0  A    1  [1, 4, 7]
1  A    4  [1, 4, 7]
2  A    7  [1, 4, 7]
3  B    2  [2, 5, 8]
4  B    5  [2, 5, 8]
5  B    8  [2, 5, 8]
6  C    3  [3, 6, 9]
7  C    6  [3, 6, 9]
8  C    9  [3, 6, 9]

Я могу сделать это с помощью groupby и apply или agg, а затем присоединить фреймы данных, например,

df_tmp = df.groupby('a')['b'].agg(list).reset_index()
df.merge(df_tmp, on='a')

Но я бы также ожидаете сделать то же самое с transform

df['c'] = df.groupby('a')['b'].transform(list)

, но столбец c такой же, как столбец b

Также следующий

df.groupby('a')['b'].transform(lambda x: len(x))

вернуть серию со значениями 3, т.е. длина сгруппированных элементов равна 3 (и следовало ожидать)

Также это

df.groupby('a')['b'].transform(lambda x: list(x))

не дает ожидаемого результата.

Итак, на мой вопрос, как я могу получить желаемый результат с помощью groupby и tranform

pandas версия 1.0.5

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Я предлагаю одно исправление ниже. PS: должно быть что-то не так с transform, когда тип объекта list tuple или set ..

df.groupby('a')['b'].transform(lambda x : [x.tolist()]*len(x))
Out[226]: 
0    [1, 4, 7]
1    [1, 4, 7]
2    [1, 4, 7]
3    [2, 5, 8]
4    [2, 5, 8]
5    [2, 5, 8]
6    [3, 6, 9]
7    [3, 6, 9]
8    [3, 6, 9]
Name: b, dtype: object
2 голосов
/ 18 июня 2020

Интересная проблема, не уверен, что происходит с transform в фоновом режиме. Один go -круг к map с groupby().agg():

df['c'] = df['a'].map(df.groupby('a')['b'].agg(list))

Вывод:

   a  b          c
0  A  1  [1, 4, 7]
1  B  2  [2, 5, 8]
2  C  3  [3, 6, 9]
3  A  4  [1, 4, 7]
4  B  5  [2, 5, 8]
5  C  6  [3, 6, 9]
6  A  7  [1, 4, 7]
7  B  8  [2, 5, 8]
8  C  9  [3, 6, 9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...