Pandas 是否有其他更有效的方法从数据帧的多索引中取消列的堆栈?
我有一个对象,是在pandas中执行groupby([“a”,“B”]与.nlargest(3)函数组合得到的 i、 e: 现在每个“A”和“B”有3个值。 我做了一个反堆栈,它的工作,但我击中了内存容量,有时崩溃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 =
我记得很久以前就找到了解决这个问题的(内置)解决方案,但现在再也找不到了。如果这是重复的,我深表歉意,并提前感谢!据我所知,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