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

如何在Pandas多级索引DataFrame中选取含NaN的索引行?

解决MultiIndex中含NaN索引行的提取问题

嘿,我完全懂你碰到的这个麻烦——MultiIndex里的NaN确实没法用常规的df.isna()这类方法直接处理,毕竟索引的空值判断逻辑和列数据不太一样。我来给你一步步搞定这个问题:

首先,先还原你的示例数据

先把你给出的表格转换成可复现的代码,方便后续操作:

import pandas as pd

# 构建数据
data = {
    'Count': [3, 9, 25, 26, 99],
    'Price': ['$1.29', '$0.99', '$2.59', '$2.79', '$0.39']
}

# 创建多级索引
multi_index = pd.MultiIndex.from_tuples(
    [('Apple', 'Red'), (pd.NA, 'Green'), ('Pear', 'Red'), (pd.NA, 'Green'), ('Lime', 'Green')],
    names=['Fruit', 'Color']
)

# 生成DataFrame
df = pd.DataFrame(data, index=multi_index)

提取含NaN的第一级索引行

因为问题出在**第一级索引(Fruit)**的NaN上,我们需要专门针对这个层级的索引做空值判断:

方法1:通用兼容版(适合所有pandas版本)

用index.get_level_values()拿到目标层级的索引数组,再结合pd.isna()识别空值:

# 筛选第一级索引为NaN的行
nan_fruit_rows = df[pd.isna(df.index.get_level_values('Fruit'))]

方法2:简洁版(适合pandas >=1.3.0)

如果你的pandas版本比较新,可以直接用index.isna()并指定层级,代码更简洁:

nan_fruit_rows = df[df.index.isna(level='Fruit')]

运行结果

执行上述代码后,你会得到提取出的目标DataFrame:

Count  Price
Fruit Color             
NaN   Green     9  $0.99
      Green    26  $2.79

补充说明:为什么常规方法不行?

常规的df.isna()是用来检测列数据中的空值,不会对索引进行判断。而索引的空值需要直接操作索引对象,用get_level_values()定位到目标层级后,pd.isna()能准确识别pandas中的空值类型(包括pd.NA、np.nan等),比np.isnan()兼容性更好。

内容的提问来源于stack exchange,提问作者rajsx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:28