我有以下示例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
我想按前三列(col1
,col2
,col3
)分组,将第四列(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
列。
答案 0 :(得分:3)
像这样尝试groupby
和agg
:
(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)