Pandas groupby 将未分组的列连接成逗号分隔的字符串

S.Z*_*ong 6 python pandas

我有以下示例 df:

        col1     col2    col3   doc_no
     0     a        x       f        0
     1     a        x       f        1
     2     b        x       g        2
     3     b        y       g        3
     4     c        x       t        3
     5     c        y       t        4
     6     a        x       f        5
     7     d        x       t        5
     8     d        x       t        6
Run Code Online (Sandbox Code Playgroud)

我想按前 3 列 ( col1, col2, col3) 进行分组,根据前 3 列的分组将第四列 ( doc_no) 连接成一行字符串,并生成 3 列分组的排序计数列 ( count)。下面是所需的输出示例(列顺序无关紧要):

        col1     col2    col3   count      doc_no
     0     a        x       f       3     0, 1, 5
     1     d        x       t       2        5, 6
     2     b        x       g       1           2
     3     b        y       g       1           3
     4     c        x       t       1           3
     5     c        y       t       1           4
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?我使用下面的行来获取分组和计数:

grouped_df = df.groupby(['col1','col2','col3']).size().reset_index(name='count')\
    .sort_values(['count'], ascending=False).reset_index()
Run Code Online (Sandbox Code Playgroud)

但我不确定如何doc_no在同一代码行中获取连接列。

cs9*_*s95 10

尝试groupbyagg喜欢这样:

(df.groupby(['col1', 'col2', 'col3'])['doc_no']
   .agg(['count', ('doc_no',  lambda x: ','.join(map(str, x)))])
   .sort_values('count', ascending=False)     
   .reset_index())

  col1 col2 col3  count doc_no
0    a    x    f      3  0,1,5
1    d    x    t      2    5,6
2    b    x    g      1      2
3    b    y    g      1      3
4    c    x    t      1      3
5    c    y    t      1      4
Run Code Online (Sandbox Code Playgroud)

agg使用起来很简单,因为您可以指定要在单个列上运行的减速器列表。