Python中如何将DataFrame非NA连续段的值统一填充为该段首个值
实现方法
可以直接通过pandas的内置方法实现,操作步骤如下:
前置处理
如果你的原始数据里的Na是字符串类型,需要先转换为pandas可识别的空值:
import pandas as pd import numpy as np df['colname'] = df['colname'].replace('Na', np.nan)
核心处理代码
# 标记非空值位置 mask = df['colname'].notna() # 给每一段连续非空值分配唯一组号 group_labels = (mask & ~mask.shift(fill_value=False)).cumsum().where(mask) # 按组替换为每组第一个非空值 df['colname'] = df.groupby(group_labels)['colname'].transform('first')
原理说明
- 用
notna()筛选出所有非空值的位置 - 结合
shift()偏移判断,找出每一段连续非空值的起始位置 - 对起始位置做累加求和,给每一段连续非空值分配独立的组编号,空值位置不参与分组
- 按组编号分组后,通过
transform('first')将组内所有值统一替换为该组的第一个值
完整示例(包含测试数据)
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({ 'colname': [np.nan, np.nan, np.nan, 1, 2, 3, 4, np.nan, np.nan, np.nan, np.nan, 2, 8, 5, 44, np.nan, np.nan] }) # 处理逻辑 mask = df['colname'].notna() group_labels = (mask & ~mask.shift(fill_value=False)).cumsum().where(mask) df['colname'] = df.groupby(group_labels)['colname'].transform('first') print(df)
运行后输出的结果和你要求的效果完全一致。
内容的提问来源于stack exchange,提问作者user124123
相关产品推荐
相关产品推荐

