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

获取Pandas多级索引DataFrame指定列值数组的惯用方法

问题描述

我有一个多级列索引的Pandas DataFrame,想要提取所有名为'a'的列的值,合并成一个一维数组。目前用的代码能实现需求,但可读性和易用性都不高,有没有更符合Pandas惯用写法的实现方式?

原代码及输出:

import numpy as np
import pandas as pd

x = pd.DataFrame({'a': [1, 2, 3], 'b': [1, 2, 3]})
y = pd.DataFrame({'a': [11, 12, 13], 'b': [21, 22, 23]})

df = pd.concat({'x': x, 'y': y}, axis=1)

# 原实现
result = np.concatenate(df.loc[:, (slice(None), 'a')].values)

原输出:

df:
   x      y
   a  b   a   b
0  1  1  11  21
1  2  2  12  22
2  3  3  13  23

result:
[ 1 11  2 12  3 13]

更惯用的实现方式

方法1:使用xs方法提取指定层级列

xs(cross-section)是Pandas专门为多级索引设计的截面提取方法,语法直观易懂:

result = df.xs('a', level=1, axis=1).to_numpy().ravel()
  • level=1指定提取第二层级(从0计数)中列名为'a'的所有列
  • to_numpy()将筛选后的子DataFrame转为二维数组
  • ravel()将二维数组展平为一维,效果与原代码一致

方法2:通过列索引层级筛选

利用列索引的get_level_values方法动态筛选目标列,灵活性更强:

# 筛选第二层级为'a'的列
a_cols = df.columns.get_level_values(1) == 'a'
result = df.loc[:, a_cols].to_numpy().ravel()

方法3:用stack重塑数据后提取

通过stack将列的层级转为行索引,直接提取目标列的值:

result = df.stack(level=0)['a'].to_numpy()
  • stack(level=0)把第一层级的列索引('x'、'y')转为行的内层索引
  • 此时提取'a'列即可得到所有目标值,转numpy数组后直接是一维格式

以上三种方法均符合Pandas的惯用写法,可读性和维护性远高于原实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:03:10