如何在Pandas中创建仅当Key跨序列重复时递增的索引?
解决方案
首先构造示例数据:
import pandas as pd data = { 'Key': ['A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B', 'A'], 'Value': [10, 20, 30, 40, 50, 60, 70, 70, 80, 90] } df = pd.DataFrame(data)
要实现你需要的索引,核心是先识别连续相同Key组成的块,再对每个Key的不同块进行序号递增:
- 生成块标识:标记每个连续相同Key的分组块
# 当当前行Key和上一行不同时,标记为新块,用cumsum生成块编号 df['block'] = df['Key'].ne(df['Key'].shift()).cumsum()
- 对每个Key的块进行稠密排序,得到目标索引
# 按Key分组,对每个组内的block进行稠密排名,得到每个块的递增序号 df['Index'] = df.groupby('Key')['block'].rank(method='dense').astype(int)
最后可删除临时的block列:
df = df.drop('block', axis=1)
执行后得到的结果与你期望的完全一致:
Key Value Index 0 A 10 1 1 A 20 1 2 B 30 1 3 B 40 1 4 C 50 1 5 A 60 2 6 A 70 2 7 A 70 2 8 B 80 2 9 A 90 3
为什么groupby('Key').cumcount()+1不行?因为这个方法是对每个Key的所有行连续计数,而不是按「连续相同Key的块」来区分计数,所以无法满足需求。
内容的提问来源于stack exchange,提问作者Mi____
相关产品推荐
相关产品推荐

