Pandas如何为DataFrame非NaN连续段生成逐段递增1的整数列
连续非NaN段递增编号实现方案
实现思路
全程采用pandas向量化运算,无Python层逐行遍历,适配百万级以上大数据量场景,核心逻辑分三步:
- 先标记所有非NaN值的位置
- 识别每一段连续非NaN值的起始点(当前位置非NaN、前一位置为NaN)
- 对起始点标记做累计求和得到连续递增的段编号,再将原NaN位置的编号重置为NaN即可
完整实现代码
import pandas as pd import numpy as np # 原始示例数据 data = pd.DataFrame( [np.nan, np.nan, np.nan, 0.5, 1.2, 2.7, 3.8, np.nan, np.nan, 0.1, 0.7, 2.3, np.nan, np.nan, np.nan, np.nan, np.nan, 0.01, 0.4, 1.5, 2.8, 4.5, 5.6, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], columns=['origin_val'] ) # 核心计算逻辑 not_null_mask = data['origin_val'].notna() # 标记每个连续非NaN段的起始位置 segment_start_flag = not_null_mask & not_null_mask.shift(fill_value=False) # 累计求和生成递增ID,空值位置保留NaN data['segment_id'] = segment_start_flag.cumsum().where(not_null_mask, np.nan)
效果验证
运行后segment_id列输出完全匹配需求:
索引0-2为NaN,索引3-6值为1,索引7-8为NaN,索引9-11值为2,索引12-16为NaN,索引17-22值为3,索引23-28为NaN。
- 所有运算均走pandas底层C实现,无逐行循环开销,大数据量下性能表现优异。
内容的提问来源于stack exchange,提问作者ananvodo
相关产品推荐
相关产品推荐

