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

更新虚拟数据框空值行数值:Pandas代码失效问题排查

问题分析与解决方案

核心问题

你的代码没生效主要有两个原因:

  1. 列名匹配错误:你的空值虚拟列是Feat1-NaN这种包含大写NaN的命名,但代码里用"nan" in col(全小写)判断,根本找不到这些列,后续循环完全没执行。
  2. 数据类型限制:虚拟列默认是整数类型(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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:01:06