pandas groupby聚合元素列表添加

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)

我尝试了不同的方法,但无法按预期工作.

Sha*_*ica 7

可以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)

  • 注意 `apply` 效率低下,实际上是一个循环。不推荐与 Pandas 一起使用。 (2认同)

jpp*_*jpp 5

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)


zip*_*ipa 5

如果将列表转换为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)