更新虚拟数据框空值行数值:Pandas代码失效问题排查
问题分析与解决方案
核心问题
你的代码没生效主要有两个原因:
- 列名匹配错误:你的空值虚拟列是
Feat1-NaN这种包含大写NaN的命名,但代码里用"nan" in col(全小写)判断,根本找不到这些列,后续循环完全没执行。 - 数据类型限制:虚拟列默认是整数类型(
int64),而np.nan属于浮点类型,整数数组无法存储NaN,就算列名对了,赋值操作也会静默失败。
修正后的代码
import numpy as np import pandas as pd # 先把数据类型转为浮点型,才能存储NaN dummies = dummies.astype(float) # 获取所有空值虚拟列(匹配大写NaN) nan_cols_names = [col for col in dummies.columns if "NaN" in col] # 筛选出确实有非零值的空值列 nan_cols_mask = dummies[nan_cols_names].sum() > 0 nan_cols_true = list(nan_cols_mask[nan_cols_mask].index) display(dummies[nan_cols_true].sum()) for feature_nan in nan_cols_true: # 提取特征前缀(比如从Feat1-NaN得到Feat1) feature_label = feature_nan.split("-")[0] # 获取当前特征的所有非空值虚拟列 feature_cols = [col for col in dummies.columns if col.startswith(f"{feature_label}-") and col != feature_nan] # 替换对应行的0为NaN dummies.loc[dummies[feature_nan] == 1, feature_cols] = np.nan display(dummies[nan_cols_true].sum())
关键修正点
- 把数据框转为浮点型:
dummies = dummies.astype(float),确保能存储NaN。 - 列名判断改为匹配大写
"NaN":if "NaN" in col,正确识别空值虚拟列。 - 特征前缀提取改用
split("-")[0]:避免原代码[:-4]因列名长度变化出错,更可靠。 - 列筛选逻辑优化:用
startswith和排除空值列,更精准获取目标特征的非NaN虚拟列。
内容的提问来源于stack exchange,提问作者Álvaro V.
相关产品推荐
相关产品推荐

