我正在尝试使用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))})
但是我收到的错误基于'指数'不存在,有人可以建议如何完成我想要做的事情吗?
由于
答案 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
如果您有任何其他问题,请随时发表评论。