2017-06-30 17 views
2

パンダのデータフレームを再配置しようとしています。パンダ:値の列をグループ化し、新しい列見出しを作成する

現在私が持っている:

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 

はパンダでこれを行うための効率的な方法はありますか?または、私はすべてをゆっくりと手動で挽くべきですか? set_indexと最後add_prefix

おかげ

答えて

5

使用pivotまたはunstack

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: Index contains duplicate entries, cannot reshape

重複を意味し、集約が必要です。 (...、summedianmeanのような機能をpivot_tableまたはgroupbyを使用し、最後の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によってNonecolumns nameを設定し、コラムidためreset_indexを使用します。

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 
+0

私は今でしょう!ありがとう! –

+0

エラーを参照してくださいValueError:インデックスに重複したエントリが含まれています.1番目のメソッドを使用して変形することはできません... 2番目の試み... –

+0

ありがとうございました。また、複数のパラメータに対してこれを行うことはできますか?私がparamAとparam Bを持っていれば? –

関連する問題