2017-01-08 8 views
6

私は次のような(Pandas DataFrameを持っています:df_olymic) 私はこれを達成するための最も便利な方法だろうどのような独立した列に変換される列Typeの値(df_olympic_tablePandas:列の値を独立した列に変換する

オリジナルデータフレーム

In [3]: df_olympic 
Out[3]: 
    Country Type Num 
0  USA Gold 46 
1  USA Silver 37 
2  USA Bronze 38 
3  GB Gold 27 
4  GB Silver 23 
5  GB Bronze 17 
6 China Gold 26 
7 China Silver 18 
8 China Bronze 26 
9 Russia Gold 19 
10 Russia Silver 18 
11 Russia Bronze 19 

形質転換したデータフレーム

In [5]: df_olympic_table 
Out[5]: 
    Country N_Gold N_Silver N_Bronze 
0  USA  46  37  38 
1  GB  27  23  17 
2 China  26  18  26 
3 Russia  19  18  19 

をしたいと思います?

+1

可能な重複[Pythonのパンダ:列ヘッダーとして行を変換](HTTP ://stackoverflow.com/questions/17298313/python-pandas-convert-rows-as-column-headers) – Aprillion

+0

申し訳ありませんが、私はパンダの一般的な用語を乱用する可能性があります。まだ学習を続けています:-) – TruLa

+1

@Aprillion - 'pivot_table'は必要ではありません。 – jezrael

答えて

4

あなたはDataFrame.pivotを使用することができます。

df = df.pivot(index='Country', columns='Type', values='Num') 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  19 19  18 
USA   38 46  37 

DataFrame.set_indexSeries.unstackのもう一つの解決策:

df = df.set_index(['Country','Type'])['Num'].unstack() 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  19 19  18 
USA   38 46  37 

が、取得した場合:

ValueError: Index contains duplicate entries, cannot reshape

は、デフォルトでは、いくつかのaggreagte機能でpivot_tableが必要それはですが、あなたはsumfirst使用することができます... unstackmeanをaggreagtingし、再構築して

#add new row with duplicates value in 'Country' and 'Type' 
print (df) 
    Country Type Num 
0  USA Gold 46 
1  USA Silver 37 
2  USA Bronze 38 
3  GB Gold 27 
4  GB Silver 23 
5  GB Bronze 17 
6 China Gold 26 
7 China Silver 18 
8 China Bronze 26 
9 Russia Gold 19 
10 Russia Silver 18 
11 Russia Bronze 20 < - changed value to 20 
11 Russia Bronze 100 < - add new row with duplicates 


df = df.pivot_table(index='Country', columns='Type', values='Num', aggfunc=np.mean) 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  60 19  18 < - Russia get ((100 + 20)/ 2 = 60 
USA   38 46  37 

またはgroupby

df = df.groupby(['Country','Type'])['Num'].mean().unstack() 
print (df) 
Type  Bronze Gold Silver 
Country      
China  26 26  18 
GB   17 27  23 
Russia  60 19  18 < - Russia get ((100 + 20)/ 2 = 60 
USA   38 46  37 
+0

パーフェクト!あなたは本当に私に何か新しいことを学ばせました。どうもありがとう。 – TruLa

+0

はい、重複すると複雑です。受け入れてくれてありがとう! – jezrael

+1

@ ade1e - はい、重複を追加するためにデータを変更したので、変更された行に通知を追加します。 – jezrael

関連する問題