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)
我想创建一个列,其中包含按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]
Run Code Online (Sandbox Code Playgroud)
我可以用groupby和apply或agg然后像这样加入数据帧
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
有趣的问题,不确定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)
我在下面提出了一个解决方案。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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |