如何为pandas DataFrame中连续重复的Chronological列值分配唯一ID
解决方案
直接使用pandas内置的向量化操作实现,仅需一行核心代码即可完成,执行效率远高于手动for循环遍历:
# 核心逻辑 dfA['unique_id'] = ((dfA['Chronological'] != dfA['Chronological'].shift(1)) | (dfA['Chronological'] == 0)).cumsum()
逻辑说明
dfA['Chronological'].shift(1)是把Chronological列整体向下偏移一行,用来和当前行的取值做对比- 触发
unique_id自增的条件有两个,满足任意一个就会生成新的id:- 当前行的
Chronological取值和上一行不同 - 当前行的
Chronological取值为0(即使和上一行取值相同也会生成新id)
- 当前行的
- 最后用
cumsum()对布尔序列累加,自动生成连续的唯一id
注意事项
执行代码前请确保你的DataFrame已经按ID顺序排序,如果未排序可以先执行以下代码预处理:
dfA = dfA.sort_values('ID', ignore_index=True)
性能优势
这个方案是纯向量化操作,没有显式的Python层循环,所有计算都在pandas底层的优化逻辑中执行,时间复杂度为O(n),哪怕处理百万级行的数据也能在毫秒级完成,比你之前的遍历+切片+拼接的方案效率高几十到上百倍。
内容的提问来源于stack exchange,提问作者Murtaza
相关产品推荐
相关产品推荐

