You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何pandas中df[df.isna()]返回全NaN同形状DataFrame?

为什么df[df.isna()]会返回全NaN的同形状DataFrame?

咱们一步步拆解这个问题:

  1. 先看df.isna()的输出
    这个方法会生成一个和原DataFrame形状完全一致的布尔矩阵——每个单元格对应原DataFrame的位置,原位置是NaN就返回True,否则返回False。

  2. pandas布尔索引的两种逻辑

    • 当你用一维布尔序列(比如df.isna().any(axis=1)生成的结果:每行一个布尔值,标记该行是否存在NaN)做索引时,pandas会直接筛选出布尔值为True的整行数据,这也是你需要的“获取含NaN的行”的逻辑。
    • 但如果你直接用二维布尔矩阵(也就是df.isna()的结果)做索引,pandas会逐个单元格匹配:只有当布尔矩阵对应位置是True时,才保留原DataFrame该位置的值;如果是False,就把该位置设为NaN。
  3. 回到你的场景
    原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:54:58