熊猫:按多列分组,将一列串联,同时添加另一列

时间:2018-09-27 23:33:44

标签: python pandas dataframe group-by

如果我有以下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

我想按namerole列进行分组,将amount加起来,还要将desc,串联在一起:

      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

解决这个问题的正确方法是什么?

另一个问题:说如果正在从.csv中读取df并且它具有其他不相关的列,我该如何进行计算,然后将其与其他列一起写入新的.csv(相同的模式作为一读)?

2 个答案:

答案 0 :(得分:4)

可能不是完全的骗子,但是有很多与groupby agg相关的问题

SELECT t1.firstcol,
       t1.secondcol,
       CASE
         WHEN EXISTS (SELECT *
                             FROM elbat t2
                             WHERE t2.firstcol = t1.firstcol
                                   AND t2.secondcol <> t1.secondcol) THEN
           1
         ELSE
           0
       END flag
       FROM elbat t1;

编辑:如果数据框中还有其他列,则可以使用“第一”或“最后”来汇总它们,或者如果它们的值相同,则将它们包括在分组中。

选项1:

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

选项2:

df.groupby(['name', 'role'], as_index=False).agg({'amount':'sum', 'desc':lambda x: ','.join(x), 'other1':'first', 'other2':'first'})

答案 1 :(得分:1)

扩展@Vaishali的答案。要处理其余的列而不必指定每一列,您可以创建一个字典并将其作为agg(regate)函数的参数。

dict = {}
for col in df:
    if (col == 'column_you_wish_to_merge'):
        dict[col] = ' '.join
    else:
        dict[col] = 'first' # or any other group aggregation operation

df.groupby(['key1', 'key2'], as_index=False).agg(dict)