聚合数据帧以提供元素和分组索引字符串的总和

时间:2013-12-11 15:14:54

标签: python pandas

我正在尝试使用groupby为我提供多个元素的总和或平均值,以及每个组的原始行索引的字符串。例如,数据帧:

>>> df = pd.DataFrame([[1,2,3],[1,3,4],[2,3,4],[2,5,6],[7,8,3],[11,12,13],[11,2,3]],index = ['p','q','r','s','t','u','v'],columns =['a','b','c'])

    a   b   c
p   1   2   3
q   1   3   4
r   2   3   4
s   2   5   6
t   7   8   3
u  11  12  13
v  11   2   3

然后我想将df按'a'分组,给出:

     b    c    indices
1    5    7    p,q
2    8    10   r,s
7    8    3    t
11   14   16   u,v

到目前为止,我已经尝试过了:

df.groupby('a').agg({'score' : np.sum, 'indices' : lambda x: ",".join(list(x.index.values))})

但是我收到的错误基于'指数'不存在,有人可以建议如何完成我想要做的事情吗?

由于

1 个答案:

答案 0 :(得分:3)

聚合的工作方式是你给出一个键和一个值,其中键是一个预先存在的列名,值是一个映射在列上的函数。

因此,要按照您想要的方式获得总和,请执行以下操作:

>>> grouped = df.groupby('a')
>>> grouped.agg({'b' : np.sum, 'c' : np.sum}).head()
     c   b
a         
1    7   5
2   10   8
7    3   8
11  16  14

但是您想知道已在第三列中合并的行。所以你实际上需要在groupby之前添加这个列!这是完整的代码:

df['indices'] = range(len(df))
grouped = df.groupby('a')
final = grouped.agg({'b' : np.sum, 'c' : np.sum, 'indices': lambda x: ",".join(list(x.index.values))})

然后你得到以下结果:

>>> final.head()
   indices   c   b
a                 
1      p,q   7   5
2      r,s  10   8
7        t   3   8
11     u,v  16  14

如果您有任何其他问题,请随时发表评论。