看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
有一下需求,需要将分组的名称插入对应列本组的第一个之前的位置,现实中的场景是分组名称为队长,队长归队后站点他带的队伍的前边。
下列数据中有 ae 两组,需要将 ae 分别插入其组的第一个之前,即将 a 插入 a 组的第一个 b 前边,将 e 插入 e 组的第一个 f 前边。
a b
a c
a d
e f
e g
e h
# 转换为:
a
b
c
d
e
f
g
h
将两个列分组按第一列做聚合,这样分组生成了两个列表,然后对两个列表做相加,会对两个列表进行拼接,再对最终拼接的两行列表做爆炸,最终得到结果。
根据思路分析,代码如下:
import pandas as pd
# 用剪贴板取源数据
df = pd.read_clipboard(names=list('xy'))
df
'''
x y
0 a b
1 a c
2 a d
3 e f
4 e g
5 e h
'''
# 聚合x列,用 set 去重再转为列表
x = (df.groupby('x')
.agg({'x': set})
.agg({'x': list})
.rename(columns={'x':'y'})
)
x
'''
y
x
a [a]
e [e]
'''
# 将y列按分组转为列表
y = df.groupby('x').agg({'y': list})
y
'''
y
x
a [b, c, d]
e [f, g, h]
'''
# 矩阵相加再爆炸
(x + y).explode('y').reset_index(drop=True)
'''
y
0 a
1 b
2 c
3 d
4 e
5 f
6 g
7 h
'''
简化后代码为:
(df.groupby('x')
.agg({'x': set, 'y': list})
.map(list)
.pipe(lambda d: d.x + d.y)
.explode('y')
)
这样就完成了需求。
(完)
更新时间:2024-08-18 15:40:37 标签:pandas python 分组