You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按列组条件替换NaN值:全缺失填1,部分缺失用填充表值

解决方案

假设你有两个DataFrame:df_raw(含缺失值)和df_filled(已完成填充的参考DataFrame),同时已经定义好列分组(比如column_groups = [['A','B'], ['C','D']]),可以通过以下步骤实现需求:

场景1:行级列组判断(某行的列组全为NaN则替换为1)

如果需求是某一行的指定列组所有值都是NaN时,将该组列替换为1;否则用df_filled对应值补全缺失,代码如下:

import pandas as pd
import numpy as np

# 示例数据
df_raw = pd.DataFrame({
    'A': [1, np.nan, np.nan, 4],
    'B': [2, np.nan, np.nan, 5],
    'C': [np.nan, 3, np.nan, 6],
    'D': [np.nan, 4, np.nan, 7]
})

# 示例填充后的DataFrame(这里用均值填充,你可以替换为自己的填充结果)
df_filled = df_raw.fillna(df_raw.mean())

# 定义列分组
column_groups = [['A', 'B'], ['C', 'D']]

# 逐组处理
for group in column_groups:
    # 标记该行是否组内所有列都是NaN
    all_nan_rows = df_raw[group].isna().all(axis=1)
    # 全NaN行替换为1
    df_raw.loc[all_nan_rows, group] = 1
    # 非全NaN行用df_filled补全缺失值
    df_raw.loc[~all_nan_rows, group] = df_raw.loc[~all_nan_rows, group].fillna(df_filled.loc[~all_nan_rows, group])

# 查看结果
print(df_raw)

输出结果:

A    B    C    D
0  1.0  2.0  2.5  3.5
1  2.5  3.5  3.0  4.0
2  1.0  1.0  1.0  1.0
3  4.0  5.0  6.0  7.0

场景2:列级列组判断(整个列组所有值都是NaN则替换为1)

如果需求是整个列组的所有行都是NaN时,将该组列全部设为1;否则用df_filled补全缺失,代码如下:

for group in column_groups:
    # 检查整个列组是否所有值都是NaN
    group_is_all_nan = df_raw[group].isna().all().all()
    if group_is_all_nan:
        df_raw[group] = 1
    else:
        # 用df_filled补全该组的缺失值
        df_raw[group] = df_raw[group].fillna(df_filled[group])

代码解释

  • isna().all(axis=1):针对行维度,检查当前列组的所有值是否都是NaN,返回布尔Series标记符合条件的行
  • isna().all().all():先按列检查是否全NaN,再按组检查所有列是否都满足全NaN,判断整个列组是否无有效数据
  • fillna(df_filled[group]):仅补全df_raw中该组的缺失值,保留原有非NaN数据

内容的提问来源于stack exchange,提问作者Sepp Seppel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:30:56