Ker*_*754 11 python aggregate list pandas pandas-groupby
我有一个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]
Run Code Online (Sandbox Code Playgroud)
我想执行一个聚合groupby,以元素方式添加存储在Y列中的列表.代码我尝试过:
df.groupby('X').agg({'Y' : sum})
Run Code Online (Sandbox Code Playgroud)
结果如下:
Y
X
71455 [334.0, 319.0, 298.0, 323.0, 75.0, 55.0, ...
Run Code Online (Sandbox Code Playgroud)
所以它已经连接了列表而不是按元素加总.然而,预期的结果是:
X Y
71455 [337.0, 327.0, 311.0, 333.0]
57674 [54.0, 114.0, 124.0, 103.0]
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的方法,但无法按预期工作.
可以apply在分组数据帧上使用以获取元素添加:
df.groupby('X')['Y'].apply(lambda x: [sum(y) for y in zip(*x)])
Run Code Online (Sandbox Code Playgroud)
这导致熊猫系列对象:
X
57674 [54.0, 114.0, 124.0, 103.0]
71455 [337.0, 327.0, 311.0, 333.0]
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果将列表转换为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
Run Code Online (Sandbox Code Playgroud)