pandas groupby 聚合逐元素列表添加
Posted
技术标签:
【中文标题】pandas groupby 聚合逐元素列表添加【英文标题】:pandas groupby aggregate element-wise list addition 【发布时间】:2019-01-26 08:13:35 【问题描述】:我有一个如下所示的 pandas 数据框:
X Y
71455 [334.0, 319.0, 298.0, 323.0]
71455 [3.0, 8.0, 13.0, 10.0]
57674 [54.0, 114.0, 124.0, 103.0]
我想执行聚合groupby
,它按元素添加存储在 Y 列中的列表。我试过的代码:
df.groupby('X').agg('Y' : sum)
结果如下:
Y
X
71455 [334.0, 319.0, 298.0, 323.0, 75.0, 55.0, ...
所以它连接了列表,而不是按元素求和。然而,预期的结果是:
X Y
71455 [337.0, 327.0, 311.0, 333.0]
57674 [54.0, 114.0, 124.0, 103.0]
我尝试了不同的方法,但无法按预期工作。
【问题讨论】:
【参考方案1】:Pandas 并非设计用于一系列列表。这种尝试迫使 Pandas 使用无法以矢量化方式操作的object
dtype 系列。相反,您可以在聚合之前将一系列列表拆分为数字系列:
import pandas as pd
df = pd.DataFrame('X': [71455, 71455, 57674],
'Y': [[334.0, 319.0, 298.0, 323.0],
[3.0, 8.0, 13.0, 10.0],
[54.0, 114.0, 124.0, 103.0]])
df = df.join(pd.DataFrame(df.pop('Y').values.tolist()))
res = df.groupby('X').sum().reset_index()
print(res)
X 0 1 2 3
0 57674 54.0 114.0 124.0 103.0
1 71455 337.0 327.0 311.0 333.0
【讨论】:
df.pop('Y').values.tolist() 可以替换成列表(df.pop('Y')) @ArcanistLupus,是的,它可以,但它一定更好吗?我相信 NumPy 数组 -> 直接列出非常有效。【参考方案2】:如果您将列表转换为 numpy
数组 sum
将起作用:
df['Y'] = df['Y'].apply(np.array)
df.groupby('X')['Y'].apply(np.sum)
#X
#57674 [54.0, 114.0, 124.0, 103.0]
#71455 [337.0, 327.0, 311.0, 333.0]
#Name: Y, dtype: object
【讨论】:
注意apply
效率低下,实际上是一个循环。不建议使用 Pandas。【参考方案3】:
可以在分组数据帧上使用apply
来获得元素加法:
df.groupby('X')['Y'].apply(lambda x: [sum(y) for y in zip(*x)])
这会产生一个熊猫系列对象:
X
57674 [54.0, 114.0, 124.0, 103.0]
71455 [337.0, 327.0, 311.0, 333.0]
【讨论】:
注意apply
效率低下,实际上是一个循环。不建议使用 Pandas。以上是关于pandas groupby 聚合逐元素列表添加的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用groupby函数进行分组聚合并使用agg函数将每个分组特定变量对应的多个内容组合到一起输出(merging content within a specific column of g
Pandas groupby 聚合以截断最早日期而不是最旧日期