熊猫:groupby期间聚合数组,相当于SQL的array_agg?

时间:2019-12-16 15:40:12

标签: pandas

我有这个数据框:

df1 = pd.DataFrame([
    { 'id': 1, 'spend': 60, 'store': 'Stockport' },
    { 'id': 2, 'spend': 68, 'store': 'Didsbury' },
    { 'id': 3, 'spend': 70, 'store': 'Stockport' },
    { 'id': 4, 'spend': 35, 'store': 'Didsbury' },
    { 'id': 5, 'spend': 16, 'store': 'Didsbury' },
    { 'id': 6, 'spend': 12, 'store': 'Didsbury' },
])

我已按商店进行了分组,并按商店获得了总支出:

df.groupby("store").agg({'spend': 'sum'})\
    .reset_index().sort_values("spend", ascending=False)

store        spend   
Didsbury     131  
Stockport    130 

有没有一种方法可以获取每个商店的ID作为分组对象中的一列?就像Postgres中的ARRAY_AGG一样?因此,所需的输出将是:

store        spend   ids
Didsbury     131     [2,4,5,6]
Stockport    130     [1,3]

2 个答案:

答案 0 :(得分:3)

我们可以使用named_aggregations,这是自pandas >= 0.25.0起可用的一种聚合方法。

注意如何立即将列重命名为“ ids”:

df1.groupby('store').agg(
    spend=('spend', 'sum'),
    ids=('id', list)
).reset_index()
       store  spend           ids
0   Didsbury    131  [2, 4, 5, 6]
1  Stockport    130        [1, 3]

答案 1 :(得分:1)

您可以将var b = ...之类的聚合函数传递给list列:

id