我正在尝试对具有两个行ID的分层数据进行子集化。
说我在hdf
index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],
['one', 'two', 'three']],
labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3, 3],
[0, 1, 2, 0, 1, 1, 2, 0, 1, 2]])
hdf = DataFrame(np.random.randn(10, 3), index=index,
columns=['A', 'B', 'C'])
hdf
我希望进行分组,以便我看到foo
和qux
,子集只返回子行two
和列A
和C
。
我可以通过以下两个步骤完成此操作:
sub1 = hdf.ix[['foo','qux'], ['A', 'C']]
sub1.xs('two', level=1)
是否有一步到位的方法?
感谢
答案 0 :(得分:2)
看起来不是最好的,但是使用元组来获取你想要的行,然后使用方括号来选择列。
In [36]: hdf.loc[[('foo', 'two'), ('qux', 'two')]][['A', 'C']]
Out[36]:
A C
foo two -0.356165 0.565022
qux two -0.701186 0.026532
loc
可以在这里替换ix
。
答案 1 :(得分:2)
In [125]: hdf[hdf.index.get_level_values(0).isin(['foo', 'qux']) & (hdf.index.get_level_values(1) == 'two')][['A', 'C']]
Out[125]:
A C
foo two -0.113320 -1.215848
qux two 0.953584 0.134363
要复杂得多,但如果你想在第一级中选择许多不同的值,那会更好。
答案 2 :(得分:1)
itertools
救援:
>>> from itertools import product
>>>
>>> def _p(*iterables):
... return list(product(*iterables))
...
>>> hdf.ix[ _p(('foo','qux'),('two',)), ['A','C'] ]
A C
foo two 1.125401 1.389568
qux two 1.051455 -0.271256
>>>
答案 3 :(得分:1)
感谢大家的帮助。我也遇到了这个解决方案:
hdf.ix[['bar','qux'], ['A', 'C']].xs('two', level=1)