获取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
相关产品推荐
相关产品推荐

