Pandas 使用分层索引进行选择-获取数据帧的子集

Pandas 使用分层索引进行选择-获取数据帧的子集,pandas,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 c

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

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行的cols 1和cols 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是标量或向量或混合)不起作用。我遗漏了什么吗?

那么
reindex()

对于更一般的解决方案,这里有一个我以前回答过的类似问题:

我在这里复制代码:

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]]

将矩阵表示为多索引数据帧有点奇怪,您想到了什么用例?它是用来表示稀疏矩阵的吗?如果是这样,使用scipy.sparse不是更好吗?它是一个索引矩阵。这并不是我在这里展示的划行对cols,而是人对人。例如,某个系统的“jacob green”的“john smith”得分是50分。我想说的是我的索引是字符串而不是整数谢谢,这就是为什么要这样做。但我在使用它时遇到了另一个问题。。。看见
m = df.score.unstack()
m.loc[[1,2],[1,3]]