python - 采用多索引 pandas df 的子集,索引的意外行为

标签 python pandas indexing multi-index

我有来自组织为多索引数据帧的特定数据流的多次重复的数据(其中每个重复被标记为例如 ['rep1', 'rep2', .., 'repN'] )。我经常需要在一系列重复中获取较大数据帧的子集(例如 df.loc['rep5':'rep50', :] )。

但是,如果后续子集的索引仍然保留较大数据帧中的整个索引值列表(即 ['rep1', 'rep2', .., 'repN'] ),我无法找到一种方法来做到这一点。

因此,作为一个简化的示例,给出以下 df:

dfs = [pd.DataFrame({'vals': range(3)}) for i in range(3)]
df = pd.concat(dfs, keys=['l1', 'l2', 'l3'])

df

      vals
l1 0     0
   1     1
   2     2
l2 0     0
   1     1
   2     2
l3 0     0
   1     1
   2     2

然后取它的一个子集:

subset = df.loc['l2':, :]
subset
      vals
l2 0     0
   1     1
   2     2
l3 0     0
   1     1
   2     2

查看子集的索引,原来的'l1'索引剩余:

subset.index
MultiIndex(levels=[['l1', 'l2', 'l3'], [0, 1, 2]],
           labels=[[1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2]

但是,如果我重置该索引级别,'l1'似乎消失了:

subset.reset_index(level=0)
    level_0 vals
0   l2  0
1   l2  1
2   l2  2
0   l3  0
1   l3  1
2   l3  2

然后我可以输入 'level_0'作为索引返回,基本上达到了我想要实现的目标

subset.reset_index(level=0).set_index('level_0', append=True).reorder_levels([1, 0]).index
MultiIndex(levels=[['l2', 'l3'], [0, 1, 2]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
           names=['level_0', None])

但这显然是一条非常迂回的路线。我想的另一个选择是删除其他行,但我发现 df.drop当尝试为多索引 df 执行一系列行时非常笨重。

如果数据帧不是分层的,则不会发生此行为。例如:

df = pd.DataFrame({'vals': range(5)}, index=['a', 'b', 'c', 'd', 'e'])

df.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

然后取一个子集

subset = df.loc[('b', 'c', 'd'),:]
subset.index
Index(['b', 'c', 'd'], dtype='object')

我不清楚为什么会出现这样的情况。

最佳答案

我认为您需要的是 pd.MultiIndex.remove_unused_levels

subset.index.remove_unused_levels()

输出:

MultiIndex(levels=[['l2', 'l3'], [0, 1, 2]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])

关于python - 采用多索引 pandas df 的子集,索引的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44766143/

相关文章:

python - 模拟 pandas apply 的返回值

c++ - 获取 C++ 映射中元素的索引

sql - 什么时候适合使用index_scan来获取已经排序的数据?

python - setup.py(setuptools)和源代码中的自动版本号?

python - 字典控制 turtle 的运动

python - matplotlib 颜色条边界未实现

python - 如何根据 Pandas 中的列填充缺失值?

python - Pandas :从多级列索引中删除一个级别?

python - 如何使用 Keras imdb 数据集预测情绪分析?

c++ - 使用整数列表文档进行全文搜索的最佳方法