Pandas 通过根据另一列的值添加列级别来重塑数据框

Pandas reshape dataframe by adding a column level based on the value of another column

我有一个 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() 函数可以完成这项工作,但不知道如何做。

IIUC,使用DataFrame.set_index and unstack, and 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