2017-01-08 21 views
6

我有Pandas DataFrame,看起來像下面的樣子(df_olymic)。 我想Type列的值在獨立列(df_olympic_table熊貓:在獨立列中變換列的值

原始數據幀

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 :/ /問題/問題/ 17298313/python-pandas-convert-rows-as-column-headers) – Aprillion

+0

對不起,我可能會濫用熊貓的通用術語。仍然繼續學習:-) – TruLa

+1

@Aprillion - 'pivot_table'沒有必要,如果不是更好的重複是'pivot'。 – 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

需要pivot_table一些aggreagte功能,默認情況下它是np.mean,但你可以用sumfirst ...

#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與aggreagting mean,重塑通過unstack

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