我有DataFrame和MultiIndex列,如下所示:
# sample data
col = pd.MultiIndex.from_arrays([['one', 'one', 'one', 'two', 'two', 'two'],
['a', 'b', 'c', 'a', 'b', 'c']])
data = pd.DataFrame(np.random.randn(4, 6), columns=col)
data
Run Code Online (Sandbox Code Playgroud)

['a', 'c']从第二级别仅选择特定列(例如,不是范围)的正确,简单方法是什么?
目前我这样做:
import itertools
tuples = [i for i in itertools.product(['one', 'two'], ['a', 'c'])]
new_index = pd.MultiIndex.from_tuples(tuples)
print(new_index)
data.reindex_axis(new_index, axis=1)
Run Code Online (Sandbox Code Playgroud)

然而,它不是一个好的解决方案,因为我必须淘汰itertools,手工构建另一个MultiIndex,然后重新索引(我的实际代码甚至更麻烦,因为列列表不是那么容易获取).我很确定必须有一些ix或xs这样做,但我尝试的一切都导致了错误.
假设我们有一个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']], …Run Code Online (Sandbox Code Playgroud) 我正在尝试在MultiIndex列上使用查询。它适用于MultiIndex行,但不适用于该列。是否有一个原因?该文档显示的示例类似于下面的第一个示例,但并不表示它不适用于MultiIndex列。
我知道还有其他方法可以做到这一点,但是我正在专门尝试使用查询功能来做到这一点。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((4,4)))
df.index = pd.MultiIndex.from_product([[1,2],['A','B']])
df.index.names = ['RowInd1', 'RowInd2']
# This works
print(df.query('RowInd2 in ["A"]'))
df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([[1,2],['A','B']])
df.columns.names = ['ColInd1', 'ColInd2']
# query on index works, but not on the multiindexed column
print(df.query('index < 2'))
print(df.query('ColInd2 in ["A"]'))
Run Code Online (Sandbox Code Playgroud)