熊猫groupby concat未分组的列成逗号分隔的字符串

时间:2020-05-29 23:09:33

标签: 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

我想按前三列(col1col2col3)分组,将第四列(doc_no)连接到基于以下内容的字符串行中前3列的分组,以及生成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

我将如何去做?我使用下面的行获取分组和计数:

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

但是我不确定如何在同一代码行中同时获得串联的doc_no列。

3 个答案:

答案 0 :(得分:3)

像这样尝试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

agg使用简单,因为您可以指定在单个列上运行的reducers列表。

答案 1 :(得分:3)

让我们这样做

df.doc_no=df.doc_no.astype(str)
s=df.groupby(['col1','col2','col3']).doc_no.agg(['count',','.join]).reset_index()
s
  col1 col2 col3  count   join
0    a    x    f      3  0,1,5
1    b    x    g      1      2
2    b    y    g      1      3
3    c    x    t      1      3
4    c    y    t      1      4
5    d    x    t      2    5,6

答案 2 :(得分:1)

另一种方式

df2=df.groupby(['col1','col2','col3']).doc_no.agg(doc_no=('doc_no',list)).reset_index()
df2['doc_no']=df2['doc_no'].astype(str).str[1:-1]

enter image description here