使用Pandas groupby,如何使用加法聚合列表的一列?

时间:2018-09-05 00:50:54

标签: python pandas numpy pandas-groupby

我有一个数据框,其中的一列包含值列表。数据框中的每一行都有一个长度相同的列表。我想使用Dataframe.groupby对数据框中的数据进行分组,并按以下方式汇总列表:

在:

import pandas as pd

#Sample data
a = pd.DataFrame([['a', 'test', list([0,1,2,3,4])],['b', 'test', list([5,6,7,8,9])]], columns=['id', 'grp', 'values'])
print(a)

#Some function to group the dataframe
#b = a.groupby('grp').someAggregationFunction()

#Example of desired output
b = pd.DataFrame([['test', list([5,7,9,11,13])]], columns=['grp', 'values'])
    print(b)

出局:

  id   grp           values
0  a  test  [0, 1, 2, 3, 4]
1  b  test  [5, 6, 7, 8, 9]

    grp             values
0  test  [5, 7, 9, 11, 13]

4 个答案:

答案 0 :(得分:3)

您可能不喜欢这个答案,但是最好不要在数据框中使用列表。您应该尽可能地将数字序列用于数字数据:

Foreground Service

答案 1 :(得分:2)

将其放入一行

a.groupby('grp')['values'].apply(lambda x : pd.DataFrame(x.values.tolist()).sum().tolist())
Out[286]: 
grp
test    [5, 7, 9, 11, 13]
Name: values, dtype: object

我也不建议在此使用apply

b=pd.DataFrame(a['values'].values.tolist()).groupby(a['grp']).sum()
pd.DataFrame({'grp':b.index,'values':b.values.tolist()})
Out[293]: 
    grp             values
0  test  [5, 7, 9, 11, 13]

答案 2 :(得分:1)

一种解决方案是将您的transform lists变成np.arrays并使用简单的总和

a['v'] = a.v.transform(np.array)
a.groupby('grp').v.apply(lambda x: x.sum())

    grp     v
0   test    [5, 7, 9, 11, 13]

请注意,我已将values更改为v,不要误认为.values的{​​{1}}访问器

答案 3 :(得分:1)

使用numpy.stack

pd.DataFrame(
    [(i, np.stack(g).sum(0)) for i, g in a.groupby('grp')['values']],
    columns=['grp', 'values']
)

    grp             values
0  test  [5, 7, 9, 11, 13]

也使用apply,但是apply会很慢:

a.groupby('grp')['values'].apply(lambda x: np.stack(x).sum(0)).to_frame('values')

                 values
grp
test  [5, 7, 9, 11, 13]