我有一个代表矩阵的数据框。它由行号和列号索引,类似于:
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是标量或向量或混合)不应该起作用。我错过了什么吗?
答案 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]]