选择分层索引 - 获取数据帧的子集

时间:2014-01-20 12:34:11

标签: pandas

我有一个代表矩阵的数据框。它由行号和列号索引,类似于:

arrays = [[1,1,1,2,2,2,3,3,3],[1,2,3,1,2,3,1,2,3]]
tuples = zip(*arrays)
index = MultiIndex.from_tuples(tuples, names=['row', 'col'])
df = DataFrame([100,99,98,97,96,95,94,93,92],index,columns=['score'])


score
row col 
1   1    100
    2    99
    3    98
2   1    97
    2    96
    3    95
3   1    94
    2    93
    3    92

现在我想弄清楚如何只选择第1行的第1列和第3列,这意味着会返回一些代码:

score
row col 
1   1    100
    3    98

当然我不是在寻找明确选择1和3的代码,而是更一般的情况,其中我将传递0级索引列表和1级索引列表,并将返回相应的子集。

我试过了:

k1 = 1
k2 = [1,3]
df.ix[k1,k2]

引发错误。

这确实有效:

df.ix[k1].ix[k2]

但是只有当k1是标量时。如果k1=[1,3]未检索到正确的子集,因为返回数据帧仍然使用0级索引编制索引。

它看起来像作者想要的那样......我认为没有理由df.ix[k1,k2](其中k1和k2是标量或向量或混合)不应该起作用。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

reindex()怎么样?

df.reindex([1,2], level=0).reindex([1,3], level=1)

对于更一般的解决方案,这是我之前回答的类似问题:

How to index into a pandas multindex with ix

我在这里复制代码:

import numpy as np
def ms(df, *args):
    idx = df.index
    for i, values in enumerate(args):
        if values is not None:
            if np.isscalar(values):
                values = [values]
            idx = idx.reindex(values, level=i)[0]
    return df.ix[idx]

ms(df, [1,2], [1, 3])

但我认为unstack()矩阵更好:

m = df.score.unstack()
m.loc[[1,2],[1,3]]