【问题标题】:stack rows as columns based on another rank column基于另一个排名列将行堆叠为列
【发布时间】:2021-11-21 17:35:13
【问题描述】:

我有一个这样的数据框:

                           offer_id   hurdle  hurdle_lvl  reward_value
0  5c0c1545a944456aa28dcf578e0cbdd2  35000.0           1         500.0
1  5c0c1545a944456aa28dcf578e0cbdd2  40000.0           2        1500.0
2  5c0c1545a944456aa28dcf578e0cbdd2  45000.0           3        3000.0
3  f21306541ae046edbdf0a79daea3a005    500.0           1          25.0
4  f21306541ae046edbdf0a79daea3a005    750.0           2         100.0
5  f21306541ae046edbdf0a79daea3a005  25000.0           2        1500.0

我需要重新格式化它

                       offer_id      hurdle_1  hurdle_2  hurdle_3  reward_1  reward_2 reward_3
0  5c0c1545a944456aa28dcf578e0cbdd2  35000.0   40000.0   45000.0    500.0    1500.0 3000.0
1  f21306541ae046edbdf0a79daea3a005  500.0     750.0     25000.0    25.0      100.0  1500.0

因此,根据 hurdle_lvl 列将障碍和奖励行堆叠为列。非常感谢任何帮助

所以我使用了数据透视表:

y.pivot_table(index=y.groupby('hurdle_lvl').cumcount(), columns='hurdle_lvl', values=['hurdle','reward_value'])

但这给了我一个如下的数据框:

hurdle                   reward_value                
hurdle_lvl        1        2        3            1       2       3
0           35000.0  40000.0  45000.0        500.0  1500.0  3000.0
1             500.0    750.0  30000.0         25.0   100.0  1500.0

问题是我丢失了 offer_id 映射。有什么方法可以将它与透视表结合起来?

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    使用pivot_table 并对常用值求和。

    out = df.astype({'hurdle_lvl': str}) \
            .pivot_table(['hurdle', 'reward_value'], 'offer_id', 'hurdle_lvl',
                         aggfunc='sum', fill_value=0)
    out.columns = out.columns.to_flat_index().str.join('_')
    

    输出:

    >>> out
                                      hurdle_1  hurdle_2  hurdle_3  reward_value_1  reward_value_2  reward_value_3
    offer_id                                                                                                      
    5c0c1545a944456aa28dcf578e0cbdd2     35000     40000     45000             500            1500            3000
    f21306541ae046edbdf0a79daea3a005       500     25750         0              25            1600               0
    

    【讨论】:

    • ValueError:索引包含重复的条目,无法重塑 - 我明白了。我知道它是因为 offer_id 不是唯一的。可以将其修改为对多个列具有唯一约束吗?所以 (offer_id, start_date) 对是唯一的。我们可以假设 start_date 也是一个列
    • 好的。我会用 pivot_table 解决这个问题。您想对共同值求和吗?
    • 感谢您的帮助。非常感谢。我应该更好地提出我的问题,但我只有一个截止日期?
    • @Fizi。我用你的输入数据框更新了我的答案。
    • 没有。我只想要基于 hurdle_lvl 的列。因此,每个 offer_id、start_dt 对有 3 个级别。我只是想转动它,使水平成为列。所以三行offer,start_dt变成单行
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    相关资源
    最近更新 更多