Pandas 通过根据另一列的值添加列级别来重塑数据框
Pandas reshape dataframe by adding a column level based on the value of another column
我有一个 pandas 数据框,我想 添加列级别 以拆分特定列(metric_a
、metric_b
、 metric_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
我有一个 pandas 数据框,我想 添加列级别 以拆分特定列(metric_a
、metric_b
、 metric_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