Groupby 转换到 Pandas 中的列表不起作用

dim*_*_ps 3 pandas pandas-groupby

最好用一个例子来描述

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]}
)

Run Code Online (Sandbox Code Playgroud)

我想创建一个列,其中包含按listb组的列元素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]
Run Code Online (Sandbox Code Playgroud)

我可以用groupbyapplyagg然后像这样加入数据帧

df_tmp = df.groupby('a')['b'].agg(list).reset_index()
df.merge(df_tmp, on='a')
Run Code Online (Sandbox Code Playgroud)

但我也期待与 transform

df['c'] = df.groupby('a')['b'].transform(list)
Run Code Online (Sandbox Code Playgroud)

但列c与列相同b

还有以下

df.groupby('a')['b'].transform(lambda x: len(x))
Run Code Online (Sandbox Code Playgroud)

返回具有值的系列,3即分组元素的长度为 3(预期)

还有这个

df.groupby('a')['b'].transform(lambda x: list(x))
Run Code Online (Sandbox Code Playgroud)

没有提供预期的结果。

所以对于我的问题,我怎样才能通过 groupby 和转换获得所需的结果

pandas 版本是 1.0.5

Qua*_*ang 5

有趣的问题,不确定transform后台会发生什么。一种方法是map使用groupby().agg()

df['c'] = df['a'].map(df.groupby('a')['b'].agg(list))
Run Code Online (Sandbox Code Playgroud)

输出:

   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]
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

我在下面提出了一个解决方案。PS:transform当对象类型是list tupleset..时,它应该有问题。

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
Run Code Online (Sandbox Code Playgroud)

  • @dimitris_ps 因为转换将解压列表,当我们乘以 length 时,我们多次创建相同的值,在使用转换解压后,我们将每个 sub_list 作为每行的输出 (2认同)