Pandas 是否有其他更有效的方法从数据帧的多索引中取消列的堆栈?

Pandas 是否有其他更有效的方法从数据帧的多索引中取消列的堆栈?,pandas,pandas-groupby,Pandas,Pandas Groupby,我有一个对象,是在pandas中执行groupby([“a”,“B”]与.nlargest(3)函数组合得到的 i、 e: 现在每个“A”和“B”有3个值。 我做了一个反堆栈,它的工作,但我击中了内存容量,有时崩溃 我记得很久以前就找到了解决这个问题的(内置)解决方案,但现在再也找不到了。如果这是重复的,我深表歉意,并提前感谢!据我所知,pivot_table在做了一些初步准备后应该会有所帮助 创建数据: import numpy as np np.random.seed(2021) df =

我有一个对象,是在pandas中执行groupby([“a”,“B”]与.nlargest(3)函数组合得到的

i、 e:

现在每个“A”和“B”有3个值。 我做了一个反堆栈,它的工作,但我击中了内存容量,有时崩溃


我记得很久以前就找到了解决这个问题的(内置)解决方案,但现在再也找不到了。如果这是重复的,我深表歉意,并提前感谢!

据我所知,pivot_table在做了一些初步准备后应该会有所帮助

创建数据:

import numpy as np
np.random.seed(2021)
df = pd.DataFrame({'A':np.random.randint(1,3,15), 'B':np.random.randint(1,3,15), 'C':np.random.normal(0,1,15)})
df
看起来像这样

    A   B   C
0   1   1   2.044890
1   2   1   1.075268
2   2   1   0.079020
3   1   1   0.493282
4   2   1   -0.791367
5   1   2   -2.130595
6   1   2   0.317206
7   1   2   -1.364617
8   2   2   0.358428
9   1   1   -1.305624
10  2   2   2.020718
11  2   1   -2.686804
12  2   2   0.557872
13  2   1   0.776176
14  1   1   0.202650
然后,我们选择3个最大的,
groupby
cumcount
来分配排名,并以排名为中心:

df2 = df.groupby(["A", "B"])["C"].nlargest(3).reset_index()
df2['rank'] = df2.groupby(["A", "B"]).cumcount()
pd.pivot_table(df2, values = 'C', index = ['A','B'], columns = 'rank')
这就产生了


 rank   0           1           2
A   B           
1   1   2.044890    0.493282    0.202650
    2   0.317206    -1.364617   -2.130595
2   1   1.075268    0.776176    0.079020
    2   2.020718    0.557872    0.358428

请让我知道这是否是您所追求的,如果它在内存方面起作用

使用此代码,您可能会为每个索引创建3个最大值所在的列,这意味着您将得到很多列-n组*3,带nans-这是您想要的吗?@anky hi no,对不起,我试图压缩我为您实际做的事情n是先重新编制索引,然后取消堆栈。实际上,我只想将每个索引的三个值分成三个不同的列。我正在寻找类似于“爆炸”的东西,但行到列的东西。这很有魅力!它也很快,正是我要找的。非常感谢!@Olli非常高兴它有帮助!

 rank   0           1           2
A   B           
1   1   2.044890    0.493282    0.202650
    2   0.317206    -1.364617   -2.130595
2   1   1.075268    0.776176    0.079020
    2   2.020718    0.557872    0.358428