看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
通过给数据按分组进行排序并标记序号,我们可以轻松地得到每个分组内数据的排名情况。这对于了解每个分组内数据的相对顺序很有帮助。本例,我们来看一个特殊的标记序号的案例,序号会跳过指定特殊的值。
注:本例在 pandas 2.2 下通过,同时建议安装 pyarrow 库。
我们构造数据:
import pandas as pd
df = pd.DataFrame({
'商品' : ['A']*4 + ['B'] + ['C']*2 + ['D']*2,
'活动名称' : ['买赠','正价','满减','六折',
'正价','半价','六折','正价','六折']
})
df
'''
商品 活动名称
0 A 买赠
1 A 正价
2 A 满减
3 A 六折
4 B 正价
5 C 半价
6 C 六折
7 D 正价
8 D 六折
'''
增加一个编号列以标记对应行在商品分组内的顺序,其中要跳过活动名称为「正价」的行,并「正价」所在的行记为「#」。
结果如下:
'''
商品 活动名称 编号
0 A 买赠 1
1 A 正价 #
2 A 满减 2
3 A 六折 3
4 B 正价 #
5 C 半价 1
6 C 六折 2
7 D 正价 #
8 D 六折 1
'''
我们分为两步,先生成一个序号列,然后按照规划将序号列指定,对「正价」值赋于 # 号。
先生成编号列,对「正价」的值跳过:
no = (
df.groupby('商品')
.活动名称
.apply(lambda x: (x != '正价').cumsum())
)
no
'''
商品
A 0 1
1 1
2 2
3 3
B 4 0
C 5 1
6 2
D 7 0
8 1
Name: 活动名称, dtype: int64
'''
再用 pandas 2.2 新增加的 case_when() 方法来按照规划指定值:
two_case = [(lambda x: x=='正价', '#'), (lambda x: x==x, no.array)]
df.assign(编号=df.活动名称.case_when(two_case))
'''
商品 活动名称 编号
0 A 买赠 1
1 A 正价 #
2 A 满减 2
3 A 六折 3
4 B 正价 #
5 C 半价 1
6 C 六折 2
7 D 正价 #
8 D 六折 1
'''
这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:21 p.m. 标签:python python 序号