为何pandas中df[df.isna()]返回全NaN同形状DataFrame?
为什么
df[df.isna()]会返回全NaN的同形状DataFrame? 咱们一步步拆解这个问题:
先看
df.isna()的输出
这个方法会生成一个和原DataFrame形状完全一致的布尔矩阵——每个单元格对应原DataFrame的位置,原位置是NaN就返回True,否则返回False。pandas布尔索引的两种逻辑
- 当你用一维布尔序列(比如
df.isna().any(axis=1)生成的结果:每行一个布尔值,标记该行是否存在NaN)做索引时,pandas会直接筛选出布尔值为True的整行数据,这也是你需要的“获取含NaN的行”的逻辑。 - 但如果你直接用二维布尔矩阵(也就是
df.isna()的结果)做索引,pandas会逐个单元格匹配:只有当布尔矩阵对应位置是True时,才保留原DataFrame该位置的值;如果是False,就把该位置设为NaN。
- 当你用一维布尔序列(比如
回到你的场景
原DataFrame里大部分单元格都是非NaN的,所以df.isna()里大部分位置是False。用这个矩阵索引时,这些False的位置都会被替换成NaN;而原本是NaN的位置,df.isna()对应是True,但原位置本身就是NaN,保留下来还是NaN。最终整个DataFrame自然就全是NaN了。
举个直观的例子:
假设原DataFrame是:
import pandas as pd import numpy as np df = pd.DataFrame({'A': [1, 2], 'B': [np.nan, 3]})
df.isna()的输出是:
A B 0 False True 1 False False
执行df[df.isna()]后,每个单元格按布尔值判断:
- (0,A):False → 设为NaN
- (0,B):True → 保留原NaN
- (1,A):False → 设为NaN
- (1,B):False → 设为NaN
最终得到的结果就是:
A B 0 NaN NaN 1 NaN NaN
而df.isna().any(axis=1)会把每行的布尔值做“或运算”,生成一维布尔序列:
0 True 1 False dtype: bool
用这个序列索引df,就能精准筛选出第0行(含NaN的行)。
内容的提问来源于stack exchange,提问作者Curious student
相关产品推荐
相关产品推荐

