重组熊猫数据框,从多个级别创建新列

时间:2018-08-21 14:09:39

标签: python-3.x pandas

我有以下示例数据集,并且我试图对其进行重组,以使每个级别的valuesSUBJECT和{{1}都有更多的block_name列},最好放在新的列名之前。我已经尝试过拆叠和旋转,但只有错误才没有成功。

condition_name

例如,我想留下以下内容:

SUBJECT block_name  condition_name  values
5   A   S   0.96
5   A   C   1.00
5   F   S   0.92
5   F   C   0.93
5   Te  S   0.85
5   Te  C   0.71
5   To  S   0.88
5   To  C   1.00
6   A   S   0.96
6   A   C   1.00
6   F   S   0.92
6   F   C   0.71
6   Te  S   1.00
6   Te  C   1.00
6   To  S   0.69
6   To  C   0.86
7   A   S   1.00
7   A   C   1.00
7   F   S   0.88
7   F   C   0.93
7   Te  S   0.85
7   Te  C   1.00
7   To  S   0.62
7   To  C   0.93

1 个答案:

答案 0 :(得分:1)

set_indexunstack一起使用MultiIndex的2个级别,然后将list comprehension中的列名称展平:

df = df.set_index(['SUBJECT','block_name','condition_name'])['values'].unstack([1,2])
#python 3.6+ solution
df.columns = [f'{i}_{j}_values' for i, j in df.columns]
#python bellow 3.6
#df.columns = ['{}_{}_values'.format(i, j) for i, j in df.columns]
print (df)
         A_S_values  A_C_values  F_S_values  F_C_values  Te_S_values  \
SUBJECT                                                                
5              0.96         1.0        0.92        0.93         0.85   
6              0.96         1.0        0.92        0.71         1.00   
7              1.00         1.0        0.88        0.93         0.85   

         Te_C_values  To_S_values  To_C_values  
SUBJECT                                         
5               0.71         0.88         1.00  
6               1.00         0.69         0.86  
7               1.00         0.62         0.93  

最后必要时:

df = df.reset_index()
print (df)
   SUBJECT  A_S_values  A_C_values  F_S_values  F_C_values  Te_S_values  \
0        5        0.96         1.0        0.92        0.93         0.85   
1        6        0.96         1.0        0.92        0.71         1.00   
2        7        1.00         1.0        0.88        0.93         0.85   

   Te_C_values  To_S_values  To_C_values  
0         0.71         0.88         1.00  
1         1.00         0.69         0.86  
2         1.00         0.62         0.93