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)
相关问题:
你可以使用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)