【问题标题】:Convert Pandas groupby group into columns将 Pandas groupby 组转换为列
【发布时间】:2017-01-12 09:01:58
【问题描述】:

我正在尝试将 Pandas 数据帧按两种不同的组类型 A_​​Bucket 和 B_Bucket 进行分组,并将每个 A_Bucket 组转换为一列。我得到这样的组:

grouped = my_new_df.groupby(['A_Bucket','B_Bucket'])

我希望 A_Bucket 组在列中,而 B_Bucket 组作为索引。 'A' 有大约 20 个值,B 有大约 20 个值,所以总共有大约 400 个组。

当我打印分组及其类型时,我得到:

type of grouped2 = <class 'pandas.core.groupby.DataFrameGroupBy'>
A_Bucket  B_Bucket
0.100      100.0            5.418450
           120.0           18.061367
0.125      80.0             3.100920
           100.0           14.137063
           120.0           30.744823
           140.0           38.669950
           160.0           48.303129
           180.0           74.576333
           200.0          125.119950
0.150      60.0             0.003200
           80.0             2.274807
           100.0            5.350074
           120.0           23.272970
           140.0           40.131780
           160.0           47.036912
           180.0           72.438978
           200.0          117.365480

所以 A_Bucket 组 0.100 只有 2 个值,但 0.125 有 7 个。我想要这样的数据框:

        0.1     0.125      0.15
80      NaN     3.10092    2.274807
100     5.41845 14.137063  5.350074
120     18.0613 30.744823  23.27297
140     NaN     38.66995   40.13178
160     NaN     48.303129  47.036912
180     NaN     74.576333  72.438978
200     NaN     125.11995  NaN

我看到了这个问题: Pandas groupby result into multiple columns

但我不懂语法,并且它不会像我需要的那样将第一组排列成列。我还希望这适用于多个输出列。

我该怎么做?

【问题讨论】:

  • 这似乎不起作用。它多次重复索引并且有更多的列。我希望有一个大约 20x20 的数据框,但这给出了 186 x 318。
  • 对不起。我没有很仔细地阅读你的问题。所以你实际上想要将你的数据框从长格式改成宽格式。不过有一个问题,您似乎在 groupby 之后没有进行任何聚合?
  • 是的,很抱歉我没有把它放在那里。我想取每个组/子组的平均值。对于一个输出列,我希望是 20 x 20,但对于 2 个输出列,我不确定数据框会是什么样子。

标签: python pandas dataframe


【解决方案1】:

如果我理解正确,您正在尝试重塑数据框,而不是按摘要分组,在这种情况下,您可以使用 set_index()unstack()

df.set_index(["A_Bucket", "B_Bucket"]).unstack(level=0)

#              Value
# A_Bucket     0.100     0.125       0.150
# B_Bucket          
#     60.0       NaN       NaN    0.003200
#     80.0       NaN  3.100920    2.274807
#    100.0  5.418450 14.137063    5.350074
#    120.0 18.061367 30.744823   23.272970
#    140.0       NaN 38.669950   40.131780
#    160.0       NaN 48.303129   47.036912
#    180.0       NaN 74.576333   72.438978
#    200.0       NaN 125.119950 117.365480

如果分组后确实做了总结,还是可以df.groupby(['A_Bucket', 'B_Bucket']).mean().unstack(level=0)

【讨论】:

  • 是的,第二个(使用 mean())是完美的。我现在更好地理解了unstack。谢谢!
猜你喜欢
  • 2022-12-01
  • 2013-05-30
  • 2016-06-07
  • 2021-11-14
  • 2021-09-29
  • 2021-05-24
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多