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

如何提取Multi-index DataFrame子级匹配NumPy数组的行

Pandas多层索引DataFrame按分组匹配子索引提取行

问题场景

给定如下两层索引的DataFrame:

a   b   c
0   0   0   42  65
    1   6   0   340
    2   5   71  800
    3   2   51  409
    4   0   23  279
    5   8   38  549
1   0   1   23  252
    1   9   13  977
    2   1   19  943
2   0   2   23  295
    1   3   39  458
    2   1   62  308
    3   0   95  954
    4   9   78  535
3   0   4   67  849
    1   3   46  761
    2   7   49  485
    3   0   44  638

给定NumPy数组a = np.array([2, 2, 4, 3]),需要提取每个一级索引分组下,二级索引值等于数组对应位置元素的行,期望输出为:

a   b   c
0   5   71  800
1   1   19  943
2   9   78  535
3   0   44  638

原有代码问题

之前尝试的代码:

i,j = df.index.levels
ix = a
df1 = pd.DataFrame(df.to_numpy()[ix])

逻辑错误点:直接用数组值作为全局行的整数位置索引取值,完全忽略多层索引的层级对应关系。不同一级分组下的二级索引是独立编号的,全局行号和分组内的子索引值没有对应关系,最终会取到错位的行。

正确实现方法

利用pandas多层索引的.loc标签索引能力,先构造(一级索引值, 目标二级索引值)的元组列表,直接匹配取值即可:

# 按一级索引的分组顺序,和目标数组打包成索引元组
target_index = list(zip(df.index.get_level_values(0).unique(), a))
# 标签索引提取目标行
df_result = df.loc[target_index]
# 如果不需要保留二级索引,直接删除该层级即可得到期望格式
df_result = df_result.droplevel(1)

运行后得到的结果和预期完全一致:

a   b    c
0  5  71  800
1  1  19  943
2  9  78  535
3  0  44  638

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:39:19