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