对标准化后的Pandas DataFrame过滤出现全NaN的问题求助
这个问题我碰到过!根源出在你创建标准化后DataFrame时的列名设置上,咱们一步步拆解:
异常原因
多级列索引导致的列名类型不一致
你在执行df_scaled = pd.DataFrame(df_scaled, columns = [df.columns])时,给columns参数套了一层方括号。df.columns本身已经是Pandas的Index对象(包含contr、type、total三个字符串列名),加上方括号后,Pandas会创建一个多级列索引(MultiIndex),每个列名被包装成了单元素元组(比如('contr',)而非普通字符串'contr')。过滤时的对齐失败
后续添加的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

