ave*_*123 1 python group-by dataframe pandas
如果我有以下 df:
amount name role desc
0 1.0 a x f
1 2.0 a y g
2 3.0 b y h
3 4.0 b y j
4 5.0 c x k
5 6.0 c x l
6 6.0 c y p
Run Code Online (Sandbox Code Playgroud)
我想按name和role列分组,将 加起来amount,然后将desc与 a连接起来,:
amount name role desc
0 1.0 a x f
1 2.0 a y g
2 7.0 b y h,j
4 11.0 c x k,l
6 6.0 c y p
Run Code Online (Sandbox Code Playgroud)
解决这个问题的正确方法是什么?
附带问题:假设df是从 .csv 读取并且它有其他不相关的列,我该如何进行计算,然后将其他列(与读取的架构相同)写入新的 .csv ?
可能不完全是骗局,但有很多与 groupby agg 相关的问题
df.groupby(['name', 'role'], as_index=False)\
.agg({'amount':'sum', 'desc':lambda x: ','.join(x)})
name role amount desc
0 a x 1.0 f
1 a y 2.0 g
2 b y 7.0 h,j
3 c x 11.0 k,l
4 c y 6.0 p
Run Code Online (Sandbox Code Playgroud)
编辑:如果数据框中还有其他列,您可以使用“第一个”或“最后一个”聚合它们,或者如果它们的值相同,请将它们包含在分组中。
选项1:
df.groupby(['name', 'role'], as_index=False).agg({'amount':'sum', 'desc':lambda x: ','.join(x), 'other1':'first', 'other2':'first'})
Run Code Online (Sandbox Code Playgroud)
选项 2:
df.groupby(['name', 'role', 'other1', 'other2'], as_index=False).agg({'amount':'sum', 'desc':lambda x: ','.join(x)})
Run Code Online (Sandbox Code Playgroud)