基于Pandas按列值变化规则生成ID列的实现问题
解决Pandas中按数据变化规则生成ID列的问题
需求说明
- 现有A列连续采样数据:列值变化时为传感器有效采集,列值重复时为无效采集
- ID生成规则:
- 列值连续变化时,ID保持一致
- 列值开始重复时,ID递增1
- 再次出现列值变化时,ID再次递增,以此类推
原代码问题分析
你当前的代码逻辑存在两处错误:
- 遇到列值重复时,每次循环都递增
id_value,导致每个重复行的ID独立,无法实现同一重复块共用一个ID - 列值再次变化时,仅继承前一行ID,未触发ID递增,不符合规则3
正确实现方案
我们需要先识别状态切换节点(从"变化"到"重复",或从"重复"到"变化"的位置),再通过累加切换次数生成ID:
import pandas as pd data = [3.5, 3.6, 3.7, 3.8, 1, 1, 1, 1, 1, 3.9, 4.0, 4.2, 4.4, 4.6, 4.8, 3, 3, 3, 3, 3.2, 3.3, 3.5, 2.1, 2.1, 2.1, 2.1] df = pd.DataFrame({'A': data}) # 1. 判断每行与前一行是否不同(标记是否处于"变化"状态) is_changing = df['A'] != df['A'].shift(1) # 2. 标记状态切换的节点:当前状态与前一行状态不一致的位置 switch_point = is_changing.ne(is_changing.shift()) # 3. 修正前两个节点:前两行均为"变化"状态,无切换,设为False switch_point.iloc[:2] = False # 4. 累加切换次数生成ID,初始ID为0 df['ID'] = switch_point.cumsum() # 查看结果 print(df)
输出验证
运行后输出符合预期:
A ID 0 3.5 0 1 3.6 0 2 3.7 0 3 3.8 0 4 1.0 1 5 1.0 1 6 1.0 1 7 1.0 1 8 1.0 1 9 3.9 2 10 4.0 2 11 4.2 2 12 4.4 2 13 4.6 2 14 4.8 2 15 3.0 3 16 3.0 3 17 3.0 3 18 3.0 3 19 3.2 4 20 3.3 4 21 3.5 4 22 2.1 5 23 2.1 5 24 2.1 5 25 2.1 5
内容的提问来源于stack exchange,提问作者Hansson
相关产品推荐
相关产品推荐

