【发布时间】:2018-01-14 03:33:02
【问题描述】:
假设我们有一个带有多级列标题的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
我想从指定级别中选择列列表。
required_columns = ['A', 'B']
required_level = 'level_0'
方法一:(弃用,取而代之 df.loc)
print df.select(lambda x: x[0] in required_columns, axis=1)
这样做的问题是我必须用0指定级别。如果我使用级别的名称,它会失败。
方法二:
print df.xs('A', level=required_level, axis=1)
问题在于我只能指定一个值。如果我使用 ['A', 'B'] 会失败。
方法三:
print df.ix[:, df.columns.get_level_values(required_level).isin(required_columns)]
这可行,但不如前两种方法简洁! :)
问题:
如何让方法 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)]
相关问题:
【问题讨论】:
-
虽然没有更好的方法令人惊讶,但我认为您的方法 3 是目前最好的方法。可读性很强。
-
fyi,
ix在 pandas 0.20.0 pandas.pydata.org/pandas-docs/stable/whatsnew.html#deprecate-ix 中已弃用 -
df.select()已弃用,取而代之的是df.loc(),因为 pandas 0.21
标签: python pandas dataframe multi-index