Pandas按值筛选行失效问题求助
解决pandas筛选行时返回全NaN的问题
问题原因
你遇到的全NaN结果,核心问题是用来筛选的MT是一个单列DataFrame,而非pandas布尔索引所需的一维布尔Series。当用DataFrame作为索引切片原DataFrame时,pandas会尝试对齐两者的列名——但你的MT列名和df_test的列名不匹配,所有不匹配的列就会被填充为NaN。
从你提供的MT.info()输出能明确看出:它是一个仅含1列的DataFrame,而非Series。正常情况下df_test.diagnosis == 0应该返回Series,大概率是你不小心用了双重方括号(比如df_test[['diagnosis']] == 0),才会得到DataFrame类型的结果。
解决方案
只需要确保筛选条件是布尔Series而非DataFrame,有几种简单可行的方式:
方式1:修正布尔条件的写法
获取布尔Series的正确方式是用单索引(或直接访问列属性):
# 推荐用单引号索引,兼容性更强(比如列名含空格时也能正常使用) MT = df_test['diagnosis'] == 0 # 若列名无特殊字符,也可以用属性访问:MT = df_test.diagnosis == 0
你可以用type(MT)验证,结果应为pandas.core.series.Series,而非DataFrame。
方式2:直接一步筛选(无需中间变量)
跳过中间变量MT,直接在索引中写入条件,写法更简洁:
df_filtered = df_test[df_test['diagnosis'] == 0]
方式3:用.loc明确筛选(可读性更强,避免歧义)
如果想更清晰地指定行和列的筛选范围,推荐使用.loc方法:
# 冒号表示保留所有列 df_filtered = df_test.loc[df_test['diagnosis'] == 0, :]
验证结果
修正后再查看筛选后的df_filtered,就能得到diagnosis列值为0的所有目标行,不会再出现全NaN的情况。
内容的提问来源于stack exchange,提问作者Mohamed Gamal
相关产品推荐
相关产品推荐

