如何从DataFrame中的命名列级别选择值的子集?

blu*_*e13 8 python multi-index dataframe pandas

假设我们有一个DataFrame多级列标题.

level_0         A                   B                   C          
level_1         P                   P                   P          
level_2         x         y         x         y         x         y
0       -1.027155  0.667489  0.314387 -0.428607  1.277167 -1.328771
1        0.223407 -1.713410  0.480903 -3.517518 -1.412756  0.718804
Run Code Online (Sandbox Code Playgroud)

我想从命名级别中选择列列表.

required_columns = ['A', 'B']
required_level = 'level_0'
Run Code Online (Sandbox Code Playgroud)

方法1 :(不赞成使用df.loc)

print df.select(lambda x: x[0] in required_columns, axis=1)
Run Code Online (Sandbox Code Playgroud)

这个问题是我必须用0指定级别.如果我使用级别的名称,它将失败.

方法2:

print df.xs('A', level=required_level, axis=1)
Run Code Online (Sandbox Code Playgroud)

这个问题是我只能指定一个值.如果我使用['A','B']则失败.

方法3:

print df.ix[:, df.columns.get_level_values(required_level).isin(required_columns)]
Run Code Online (Sandbox Code Playgroud)

这有效,但不像前两种方法那样简洁!:)

题:

如何使方法1或2工作?或者,有更多的pythonic方式?

MWE:

import pandas as pd
import numpy as np

header = pd.MultiIndex.from_product([['A', 'B', 'C'],
                                     ['P'],
                                     ['x', 'y']],
                                    names=['level_0',
                                           'level_1',
                                           'level_2'])
df = pd.DataFrame(
    np.random.randn(2, 6),
    columns=header
)

required_columns = ['A', 'B']
required_level = 'level_0'

print df
print df.select(lambda x: x[0] in required_columns, axis=1)
print df.xs('A', level=required_level, axis=1)
print df.ix[:, df.columns.get_level_values(required_level).isin(required_columns)]
Run Code Online (Sandbox Code Playgroud)

相关问题:

  1. pandas dataframe选择multiindex中的列
  2. 为列提供多个索引/标头

roo*_*oot 6

你可以使用reindex:

df.reindex(columns=required_columns, level=required_level)
Run Code Online (Sandbox Code Playgroud)

结果输出:

level_0         A                   B          
level_1         P                   P          
level_2         x         y         x         y
0       -1.265558  0.681565 -0.553084 -1.340652
1        1.705043 -0.512333 -0.785326  0.968391 
Run Code Online (Sandbox Code Playgroud)