Pandas:对值进行分组并创建新的列标题

时间:2017-06-30 13:31:56

标签: python pandas

我正在尝试重新安排一个pandas数据帧。

目前我有:

id  mins  param
1   10    0.15
1   11    0.16 
1   12    0.17
2   10    0.20
2   11    0.21
2   12    0.22

但我想重新安排并按ID分组:

id param_10 param_11 param_12 
1  0.15     0.16     0.17  
2  0.20     0.21     0.22

在熊猫中有一种有效的方法吗?或者我应该手动慢慢研磨一切?

由于

1 个答案:

答案 0 :(得分:4)

pivotunstackset_indexadd_prefix一起使用:

df = df.pivot(index='id', columns='mins', values='param').add_prefix('param_')
print (df)
mins  param_10  param_11  param_12
id                                
1         0.15      0.16      0.17
2         0.20      0.21      0.22
df = df.set_index(['id','mins'])['param'].unstack().add_prefix('param_')
print (df)
mins  param_10  param_11  param_12
id                                
1         0.15      0.16      0.17
2         0.20      0.21      0.22

如果错误:

  

ValueError:索引包含重复的条目,无法重塑

它意味着重复,需要聚合。使用pivot_tablegroupby功能,例如meansummedian,...)和最后unstack

print (df)
   id  mins  param
0   1    10   0.15 <- id mins dupe
1   1    10   0.50 <- id mins dupe
2   1    11   0.16
3   1    12   0.17
4   2    10   0.20
5   2    11   0.21
6   2    12   0.22

df = df.pivot_table(index='id', columns='mins', values='param', aggfunc='mean')
       .add_prefix('param_')
print (df)
mins  param_10  param_11  param_12
id                                
1        0.325      0.16      0.17 <- (0.15+0.5)/2 = 0.325
2        0.200      0.21      0.22
df = df.groupby(['id','mins'])['param'].mean().unstack().add_prefix('param_')
print (df)
mins  param_10  param_11  param_12
id                                
1        0.325      0.16      0.17 <- (0.15+0.5)/2 = 0.325
2        0.200      0.21      0.22

要在rename_axis之前将columns name设置为None,并使用reset_index添加到列id

df = df.rename_axis(None, axis=1).reset_index()
print (df)
   id  param_10  param_11  param_12
0   1     0.325      0.16      0.17
1   2     0.200      0.21      0.22

编辑:

多列解决方案:

df['param1'] = df['param'] / 4
print (df)
   id  mins  param  param1
0   1    10   0.15  0.0375
1   1    10   0.50  0.1250
2   1    11   0.16  0.0400
3   1    12   0.17  0.0425
4   2    10   0.20  0.0500
5   2    11   0.21  0.0525
6   2    12   0.22  0.0550

df = df.pivot_table(index='id', columns='mins', values=['param', 'param1'], aggfunc='mean')
df.columns = ['_'.join((x[0], str(x[1]))) for x in df.columns]
print (df)
    param_10  param_11  param_12  param1_10  param1_11  param1_12
id                                                               
1      0.325      0.16      0.17    0.08125     0.0400     0.0425
2      0.200      0.21      0.22    0.05000     0.0525     0.0550