我有一个代表矩阵的数据框。它由行号和列号索引,如下所示:
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和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()
?
df.reindex([1,2], level=0).reindex([1,3], level=1)
对于更通用的解决方案,这是我之前回答过的类似问题:
我在这里复制代码:
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]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句