看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注: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}
以上问题我们都无需做迭代操作。
(完)
更新时间:2024-08-18 15:41:19 标签:pandas python 分组 连接