Pandas按列名与索引下标定位列的NaN处理差异问题咨询
问题原因核心说明
两段代码的差异本质是选取列返回的数据结构不同,导致布尔运算后的索引逻辑存在差异:
- 代码1中
df["Maximum temperature (C)"]选取单列返回的是一维Series对象:
Pandas中对Series做布尔比较时,NaN和任何数值比较的结果都是NaN,当你使用这个包含NaN的布尔Series筛选原数据行时,Pandas默认会过滤掉结果为NaN的行,最终呈现的效果就是“自动剔除了包含NaN值的行”。 - 代码2中
df[[3]]选取单列返回的是二维DataFrame对象:
注意这里你传入的索引是列表[3],只要用列表包裹列索引,不管是1个还是多个列,返回结果都是DataFrame结构。对DataFrame做布尔比较时,NaN参与运算得到的结果依然是NaN,但用布尔DataFrame做行筛选时,Pandas不会自动剔除NaN对应的行,而是会把这些行的结果保留为NaN,所以呈现出“保留含NaN值的行”的效果。
行为统一方案
你可以通过调整列选取的写法,让两段代码的执行结果一致:
- 要让代码2也剔除NaN行:把写法改成
df[3] > 35,不加列表包裹索引3,返回Series即可 - 要让代码1也保留NaN行:把写法改成
df[["Maximum temperature (C)"]] > 35,用列表包裹列名,返回DataFrame即可
内容的提问来源于stack exchange,提问作者Mathhurtsmybrain
相关产品推荐
相关产品推荐

