2017-01-08 22 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