【问题标题】:Is there an alternative, more efficient way to unstack columns from a multiindex of a pandas dataframe?是否有另一种更有效的方法可以从 pandas 数据帧的多索引中取消堆叠列?
【发布时间】:2021-02-28 17:17:09
【问题描述】:

我有一个对象,我是通过在 pandas 中执行 groupby(["A", "B"] 和 .nlargest(3) 函数得到的。

即:

df.groupby(["A", "B"])["Column"].nlargest(3).reset_index().unstack()

现在每个“A”“B”有 3 个值。 我做了一个 unstack 并且它可以工作,但是我达到了内存容量并且它有时会崩溃。

我有点记得很久以前找到了解决这个问题的(内置)解决方案,但再也找不到了。如有重复请见谅,提前致谢!

【问题讨论】:

  • 使用此代码,您可能会为每个索引创建 3 个最大值所在的列,这意味着您最终会得到很多列 - ngroups*3 和 nans - 这就是您想要的?
  • @anky 嗨,不,对不起,我试图浓缩我为理解所做的实际工作,即首先重新索引然后取消堆叠。实际上,我要做的就是将每个索引的三个值分成三个不同的列。我正在寻找类似于爆炸但行到列的东西

标签: pandas pandas-groupby


【解决方案1】:

据我了解,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 个,groupbycumcount 来分配排名,并以排名为轴:

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

请让我知道这是否是您所追求的以及它是否在记忆方面有效

【讨论】:

  • 这就像一个魅力!它也很快,正是我想要的。非常感谢!
  • @Olli 很高兴它有帮助!
猜你喜欢
  • 2016-09-06
  • 1970-01-01
  • 2020-08-03
  • 2020-11-25
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多