【问题标题】:selection with hierarchical index - getting subset of the dataframe使用分层索引进行选择 - 获取数据框的子集
【发布时间】:2014-01-20 12:34:10
【问题描述】:

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

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 是标量或向量或混合)不应该工作。我错过了什么吗?

【问题讨论】:

  • 将矩阵表示为多索引 DataFrame 有点奇怪,您有什么用例?是为了表示稀疏矩阵吗?如果是这样,使用 scipy.sparse 不是更好吗?
  • 嗯,它是一个索引矩阵。它不是我在这里展示的rows vs cols,而是人vs.人。例如,某些系统的“jacob green”上的“john smith”得分为 50。我想说的是我的索引是字符串而不是整数

标签: pandas


【解决方案1】:

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

【讨论】:

  • 谢谢,这就是为什么要去。但我在使用它时偶然发现了一个不同的问题......见here
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2020-01-12
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多