Skip to main content
 首页 » 编程设计

python之Pandas 通过根据另一列的值添加列级别来 reshape 数据框

2024年02月27日15傻小

我有一个 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_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