从pandas的MultiIndex中删除一个级别[英] Remove a level from a pandas MultiIndex

本文是小编为大家收集整理的关于从pandas的MultiIndex中删除一个级别的处理方法,想解了从pandas的MultiIndex中删除一个级别的问题怎么解决?从pandas的MultiIndex中删除一个级别问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想从 MultiIndex

中完全删除一个关卡
import pandas as pd
tuples = [(0, 100, 1000),(0, 100, 1001),(0, 100, 1002), (1, 101, 1001)]
index_3levels=pd.MultiIndex.from_tuples(tuples,names=["l1","l2","l3"])
print index_3levels.levels
[Int64Index([0, 1], dtype=int64), Int64Index([100, 101], dtype=int64), Int64Index([1000, 1001, 1002], dtype=int64)]

我想提取前2个层次,实现:

print index_2levels
MultiIndex
[(0, 100), (1, 101)]

droplevel 降低级别但保留重复项:

print index_3levels.droplevel("l3")
MultiIndex
[(0, 100), (0, 100), (0, 100), (1, 101)]

原则上我可以调用 unique 来删除它们.但是,它看起来不是正确的方法.有没有更直接的方法?

推荐答案

这可能是对 droplevel 的增强,可能通过传递 uniquify=True

In [77]: MultiIndex.from_tuples(index_3levels.droplevel('l3').unique())
Out[77]: 
MultiIndex
[(0, 100), (1, 101)]

这是另一种方法

首先创建一些数据

In [226]: def f(i):
            return [(i,100,1000),(i,100,1001),(i,100,1002),(i+1,101,1001)]

In [227]: l = []

In [228]: for i in range(1000000):
             l.extend(f(i))

In [229]: index_3levels=pd.MultiIndex.from_tuples(l,names=["l1","l2","l3"])

In [230]: len(index_3levels)
Out[230]: 4000000

如上所示的方法

In [238]: %timeit MultiIndex.from_tuples(index_3levels.droplevel(level='l3').unique())
1 loops, best of 3: 2.26 s per loop

让我们将索引分成 2 个组件,l1 和 l2 并统一化,很多更快地唯一这些,因为它们是 Int64Index

In [249]: l2 = index_3levels.droplevel(level='l3').droplevel(level='l1').unique()

In [250]: %timeit index_3levels.droplevel(level='l3').droplevel(level='l1').unique()
10 loops, best of 3: 35.3 ms per loop

In [251]: l1 = index_3levels.droplevel(level='l3').droplevel(level='l2').unique()

In [252]: %timeit index_3levels.droplevel(level='l3').droplevel(level='l2').unique()
10 loops, best of 3: 52.2 ms per loop

In [253]: len(l1)
Out[253]: 1000001

In [254]: len(l2)
Out[254]: 2

重新组装

In [255]: %timeit MultiIndex.from_arrays([ np.repeat(l1,len(l2)), np.repeat(l2,len(l1)) ])
10 loops, best of 3: 183 ms per loop

时间约 270 毫秒,相当不错的加速.请注意,我认为排序可能不同,但我认为 np.repeate/np.tile 的某种组合会起作用

本文地址:https://www.itbaoku.cn/post/1727859.html