看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在进行数据处理的过程中,经常要对数据进行分组,并且将同一组的数据按照一定的方式排列,排列时用指定的字符连接。本文,我们介绍如何用 Pandas 实现类似 SQL 中的 group_concat 函数的功能。
假定我们有如下数据,它的生成代码如下:
import pandas as pd
pd.__version__
# '1.2.3'
df = pd.DataFrame({
'x': list('ABACB'),
'y': [1,2,1,2,3]
})
df
'''
x y
0 A 1
1 B 2
2 A 1
3 C 2
4 B 3
'''
现在需求是,将 x 列进行分组,分为 A、B、C 三组,每周内的 y 列内容用逗号分隔显示在同一行,即:
'''
x y
0 A 1, 1
1 B 2, 3
2 C 2
'''
对数据分组,首先想到的应该用 groupby 方法,分组完可以使用以下几个方法对分组对象中的各种数据连接:
相对而言,第二个方法比较简单。
我们来先实现一下思路中的第二个方法:
(
df.astype(str) # 先将数据全转为字符
.groupby('x') # 分组
.apply(lambda g: ','.join(g.y)) # 将各组数据中的元素用逗号连接
)
'''
x
A 1,1
B 2,3
C 2
dtype: object
'''
为了实现最终需求,我们将上边得到的 Series 转为 DataFrame:
(
df.astype(str) # 先将数据全转为字符
.groupby('x') # 分组
.apply(lambda g: ','.join(g.y)) # 将各组数据中的元素用逗号连接
.to_frame('y')
.reset_index()
)
'''
x y
0 A 1,1
1 B 2,3
2 C 2
'''
接着,我们来实现思路中的第一个方法,先做分组、转列表:
(
df.groupby('x')
.agg(list)['y']
# .apply(lambda g: list(g.y)) # 实现类似上边的功能
)
'''
x
A [1, 1]
B [2, 3]
C [2]
Name: y, dtype: object
'''
然后再处理列表格式数据,最后再转为 DataFrame:
(
df.groupby('x')
.agg(list)['y']
.astype(str)
.str[1:-1]
.to_frame()
.reset_index()
)
'''
x y
0 A 1,1
1 B 2,3
2 C 2
'''
我们还可以简化,直接在 agg 中应用 join 连接方法:
(
df.astype(str) # 先将数据全转为字符
.groupby('x') # 分组
.agg({'y': ','.join}) # join 连接元素
)
'''
y
x
A 1,1
B 2,3
C 2
'''
至此,我们就完成了需求。
如果我们要知道每个分组的数量,并以字典形式返回,那么可以这样操作:
df.groupby('x').agg(len).y.to_dict()
# 输出
{'A': 2, 'B': 2, 'C': 1}
以上问题我们都无需做迭代操作。
(完)
更新时间:Aug. 18, 2024, 3:41 p.m. 标签:pandas python 分组 连接