看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在实际数据处理中,我们经常会遇到需要对连续重复的值进行分组标记的需求。这种操作在时间序列分析、日志解析、数据分段等场景中非常有用。
在 Python 的 pandas 库中,我们可以巧妙地利用 shift() 和 cumsum() 方法来实现这一功能。本文将详细介绍如何用 pandas 高效地完成这一任务,并解释其中的关键步骤。无论你是数据分析师、数据科学家,还是 Python 开发者,这个技巧都能让你的数据处理更加灵活高效!
例如,你可能有一列水果名称 ['Apple', 'Apple', 'Orange', 'Orange', 'Banana']
,想要给它们分配递增的编号,使得相同的连续值归为同一组,而一旦值变化,编号就 +1。
import pandas as pd
my_list = ['Apple', 'Apple', 'Orange', 'Orange','Orange','Banana']
df = pd.DataFrame(my_list, columns=['fruit'])
df
'''
fruit
0 Apple
1 Apple
2 Orange
3 Orange
4 Orange
5 Banana
'''
最终结果应该为:
'''
fruit label
0 Apple 1
1 Apple 1
2 Orange 2
3 Orange 2
4 Orange 2
5 Banana 3
'''
我们在这里提供三种解决思路来生成这个编码:
pd.factorize()
来生成枚举值,取到枚举数字部分思路一的代码:
pd.factorize(df.fruit)
'''
(array([0, 0, 1, 1, 1, 2]),
Index(['Apple', 'Orange', 'Banana'], dtype='object'))
'''
df.assign(label=pd.factorize(df.fruit)[0]+1)
'''
fruit label
0 Apple 1
1 Apple 1
2 Orange 2
3 Orange 2
4 Orange 2
5 Banana 3
'''
思路二的代码:
df.assign(label=df.groupby('fruit', sort=False).ngroup().add(1))
'''
fruit label
0 Apple 1
1 Apple 1
2 Orange 2
3 Orange 2
4 Orange 2
5 Banana 3
'''
思路三的代码:
df.assign(label=(df.fruit != df.fruit.shift()).cumsum())
'''
fruit label
0 Apple 1
1 Apple 1
2 Orange 2
3 Orange 2
4 Orange 2
5 Banana 3
'''
这样就完成了最终的需求。
(完)
更新时间:2025-07-14 10:53:54 标签:pandas python 编号 连续