1

我正在尝试对具有两个行 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

我希望进行子集化,以便我看到fooand qux,子集只返回子行two和列Aand C

我可以分两步执行此操作,如下所示:

sub1 = hdf.ix[['foo','qux'], ['A', 'C']]
sub1.xs('two', level=1)

有没有一步的方法来做到这一点?

谢谢

4

4 回答 4

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这里。

于 2013-07-15T02:48:54.340 回答
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

要复杂得多,但是如果您想在第一级中选择许多不同的值会更好。

于 2013-07-15T03:24:54.123 回答
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
>>> 
于 2013-07-15T03:41:35.950 回答
1

感谢大家的帮助。我也遇到了这个解决方案:

hdf.ix[['bar','qux'], ['A', 'C']].xs('two', level=1)
于 2013-07-15T08:33:33.367 回答