2017-01-08 4 views
6

Ich habe Pandas DataFrame, die wie folgt aussieht (df_olymic). Ich würde die Werte der Spalte wie Type in unabhängigen Spalten (df_olympic_table)Pandas: transformieren Spalte Werte in unabhängigen Spalten

Original-Datenrahmen

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 

Transformed Datenrahmen

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 

verwandelt Was der bequemste Weg sein würde, dies zu erreichen, ?

+1

Mögliches Duplikat [Python Pandas: Konvertieren Zeilen als Spaltenüberschriften] (http : //stackoverflow.com/questions/17298313/python-pandas-convert-rows-as-column-headers) – Aprillion

+0

Sorry, ich könnte Pandas gemeinsame Terminologie missbrauchen. Immer noch lernen :-) – TruLa

+1

@Aprillion - 'Pivot_Table' ist nicht notwendig, wenn Duplikate nicht besser ist' Pivot'. – jezrael

Antwort

4

können Sie DataFrame.pivot verwenden:

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 

Eine andere Lösung mit DataFrame.set_index und Series.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 

aber wenn bekommen:

ValueError: Index contains duplicate entries, cannot reshape

Notwendigkeit pivot_table mit einigen aggreagte Funktion in der Standardeinstellung es ist np.mean, aber Sie können von unstacksum, first ...

#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 

Oder groupby mit aggreagting mean und umformen verwenden:

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

Perfekt! Du hast mich wirklich dazu gebracht, etwas Neues zu lernen. Danke vielmals. – TruLa

+0

Ja, es ist komplizierter, wenn Duplikate. Danke für die Annahme! – jezrael

+1

@ ade1e - Ja, ich habe die Daten für das Hinzufügen von Duplikaten geändert, daher füge ich den geänderten Zeilen einen Hinweis hinzu. – jezrael

Verwandte Themen