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
相关产品推荐
相关产品推荐

