熊猫:分组多列,连接一列,同时添加另一列

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)

我想按namerole列分组,将 加起来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 ?

Vai*_*ali 9

可能不完全是骗局,但有很多与 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)