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

对标准化后的Pandas DataFrame过滤出现全NaN的问题求助

问题原因与解决方法

这个问题我碰到过!根源出在你创建标准化后DataFrame时的列名设置上,咱们一步步拆解:

异常原因

  1. 多级列索引导致的列名类型不一致
    你在执行df_scaled = pd.DataFrame(df_scaled, columns = [df.columns])时,给columns参数套了一层方括号。df.columns本身已经是Pandas的Index对象(包含contr、type、total三个字符串列名),加上方括号后,Pandas会创建一个多级列索引(MultiIndex),每个列名被包装成了单元素元组(比如('contr',)而非普通字符串'contr')。

  2. 过滤时的对齐失败
    后续添加的labels列是普通字符串列名,和前面的多级列索引层级不匹配。当你执行df_scaled[df_scaled['labels'] == 1]过滤时,Pandas无法正确对齐多级索引列与普通列的行数据,导致原标准化列返回全NaN,只有labels列能正常显示。

解决方法

非常简单——去掉columns参数外面的方括号,直接用df.columns作为列名参数,这样创建的DataFrame列名都是普通字符串,和后续添加的labels列类型统一,过滤操作就能正常工作。

修正后的完整代码

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 1. 构造示例DataFrame
df = pd.DataFrame({'contr': [1,2,3,4,5], 'type': [1356, 89, 134, 79, 117], 'total': [582747.2, 267492.4, 264894.6, -12727438.3, 7362748.6]})

# 2. 标准化:关键修正——去掉columns参数的方括号
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
df_scaled = pd.DataFrame(df_scaled, columns=df.columns)

# 3. 添加labels列
labels = [1,2,3,4,5]
df_scaled['labels'] = labels

# 4. 执行过滤,结果正常
filtered_df = df_scaled[df_scaled['labels'] == 1]
print(filtered_df)

验证结果

运行后会得到正常的过滤输出(数值因标准化计算可能略有差异):

contr    type     total  labels
0   -1.4  1.9967  0.132053       1

你也可以通过print(df_scaled.columns)验证:修正前列是MultiIndex,修正后是普通的Index(['contr', 'type', 'total', 'labels'], dtype='object'),列名类型统一后就不会出现过滤异常了。

内容的提问来源于stack exchange,提问作者Miguel 2488

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:01:13