为何Pandas布尔索引操作一段正常一段报错?求技术解析
为什么两段代码的布尔索引结果不同?
第一段代码无报错的逻辑
missing_val_count_by_column = (X_train.isnull().sum()) missing_val_count_by_column[missing_val_count_by_column > 0]
X_train.isnull().sum()返回的是一个Series,它的索引是X_train的列名,值为对应列的缺失值总数。- 后续的
[missing_val_count_by_column > 0]是对这个Series自身做布尔索引:布尔序列的索引和原Series的索引完全匹配,Pandas能正确完成筛选,因此不会报错。
第二段代码触发报错的原因
combined_X = pd.concat([X_train, X_valid], axis=0) null_columns = combined_X.isnull().sum() dropped_columns = combined_X[null_columns > 0]
null_columns同样是一个以列名为索引的Series,但你用它的布尔序列去索引DataFramecombined_X时,Pandas的默认逻辑会出问题:
DataFrame直接使用方括号[]时,默认是匹配行索引而非列索引。但null_columns > 0的索引是列名,和combined_X的行索引完全不匹配,因此触发IndexingError。
正确筛选含缺失值列的写法
如果你的目标是从combined_X中筛选出存在缺失值的列,应该明确指定对列进行筛选:
# 方法1:用loc指定行和列的筛选范围 dropped_columns = combined_X.loc[:, null_columns > 0] # 方法2:直接提取符合条件的列名列表 dropped_columns = combined_X[null_columns[null_columns > 0].index]
这两种写法让布尔序列的列名索引与DataFrame的列索引对齐,就能避免报错。
内容的提问来源于stack exchange,提问作者Alekk
相关产品推荐
相关产品推荐

