熊猫通过根据另一列的值添加列级别来重塑数据框[重复]

Posted

技术标签:

【中文标题】熊猫通过根据另一列的值添加列级别来重塑数据框[重复]【英文标题】:Pandas reshape dataframe by adding a column level based on the value of another column [duplicate] 【发布时间】:2019-09-14 21:35:55 【问题描述】:

我有一个 pandas 数据框,我想添加一个列级别以根据另一个列的值将特定列(metric_ametric_bmetric_c)拆分为几个子列列 (parameter)。


当前数据格式:

    participant param   metric_a    metric_b    metric_c
0   alice       a       0,700       0,912       0,341
1   alice       b       0,736       0,230       0,370
2   bob         a       0,886       0,364       0,995
3   bob         b       0,510       0,704       0,990
4   charlie     a       0,173       0,462       0,709
5   charlie     b       0,085       0,950       0,807
6   david       a       0,676       0,653       0,189
7   david       b       0,823       0,524       0,430

想要的数据格式:

    participant metric_a        metric_b        metric_c
                a       b       a       b       a       b
0   alice       0,700   0,736   0,912   0,230   0,341   0,370
1   bob         0,886   0,510   0,364   0,704   0,995   0,990
2   charlie     0,173   0,085   0,462   0,950   0,709   0,807
3   david       0,676   0,823   0,653   0,524   0,189   0,430

我试过了

df.set_index(['participant', 'param']).unstack(['param'])

这给了我一个接近的结果,但我不满意,因为我想保留一个单级索引和 participant 一个常规列。

            metric_a        metric_b        metric_c
param       a       b       a       b       a       b
participant
alice       0,700   0,736   0,912   0,230   0,341   0,370
bob         0,886   0,510   0,364   0,704   0,995   0,990
charlie     0,173   0,085   0,462   0,950   0,709   0,807
david       0,676   0,823   0,653   0,524   0,189   0,430

我的直觉是 groupby()pivot_table() 函数可以完成这项工作,但不知道如何。

【问题讨论】:

【参考方案1】:

IIUC,使用DataFrame.set_indexunstack,以及reset_index指定col_level参数:

df.set_index(['participant', 'param']).unstack('param').reset_index(col_level=0)

[出]

      participant metric_a        metric_b        metric_c       
param                    a      b        a      b        a      b
0           alice    0,700  0,736    0,912  0,230    0,341  0,370
1             bob    0,886  0,510    0,364  0,704    0,995  0,990
2         charlie    0,173  0,085    0,462  0,950    0,709  0,807
3           david    0,676    NaN    0,653    NaN    0,189    NaN
4           heidi      NaN  0,823      NaN  0,524      NaN  0,430

【讨论】:

感谢您的快速回答。这样做我无法再访问participant 列:>>> df['participant'] [out] KeyError: 'participant' 我宁愿拥有这种数据结构:***.com/questions/24290297/…(问题中的grouped @Étienne 道歉,改成 col_level=0df['participant'] 应该可以工作

以上是关于熊猫通过根据另一列的值添加列级别来重塑数据框[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据合并的数据框之一的两列的值在熊猫数据框中添加值

熊猫:设置列等于另一列的分组总和[重复]

根据另一列熊猫设置列等于值

根据另一列的值修改熊猫中的日期时间列

根据索引在熊猫数据框中查找特定列的值[重复]

根据火花数据框中另一列的值查找列的最大值?