Pandas统计每列最大连续NaN值 按阈值填充或删除整列
Pandas 连续缺失值规则处理实现
直接按规则写向量化实现即可,不需要逐行循环,运行效率更高:
完整代码
import pandas as pd import numpy as np # 1. 计算每列最大连续NaN长度 is_na = df.isna() # 对连续NaN块做分组标记 na_cumsum = is_na.cumsum() # 统计每个连续NaN块的长度,取每列最大值,整列全为NaN时直接取列总长度 max_consec_nan = na_cumsum[~is_na].apply( lambda col: col.diff.diff().fillna(col.iloc[0]).max() if len(col) > 0 else len(df) ) # 2. 筛选保留列:最大连续NaN长度小于3 keep_columns = max_consec_nan[max_consec_nan < 3].index # 3. 对保留列做前向填充 df_result = df[keep_columns].ffill()
逻辑说明
- 连续NaN长度统计用
cumsum()给连续NaN块打统一标签,再算差值得到每个块的长度,比写循环快很多,数据量大的时候性能差距很明显 - 判定规则完全匹配需求:单列最长连续NaN≥3直接删整列,<3的列执行前向填充,缺失位置取上方最近的非NaN值补全
- 若列最开头存在连续NaN(上方无有效值),前向填充后该位置仍为NaN,本身不存在可用于填充的前侧有效值,符合逻辑
样例数据处理结果
对你提供的测试数据集,处理后仅保留100285、114157两列:
- 被删除列共4个:
113550、112283、101668三列全为NaN,连续长度20远大于3;100019列存在长度为4的连续NaN段(第4到第7行),满足删除条件 - 保留的
100285列最长连续NaN仅1(仅第7行单独缺失),114157列最长连续NaN仅1(第0、4、18行单独缺失),前向填充后所有可填充的缺失值都能被上方有效值补全
内容的提问来源于stack exchange,提问作者statwoman
相关产品推荐
相关产品推荐

