2017-02-21 3 views
0

Ich habe eine einfache Frage darüber, wie man einen Pandas Dataframe mit dem zusätzlichen Problem einer zusätzlichen Spalte schwenken kann.Pandas Pivot mit extra Spalte

Der Datensatz sieht wie folgt ein:

X = pd.DataFrame({'country':['Peru','Peru','Japan','Japan'],'method':['m1','m2','m1','m2'], 'value':[1,2,3,4]}) 

Country | Method | Value 
Peru  | m1  | 1 
Peru  | m2  | 2 
Japan  | m1  | 3 
Japan  | m2  | 4 

All „Länder“ haben Werte für all „Methoden“ würde Ich mag diesen Datenrahmen als eine Spalte mit jedem Land schwenken, aber ich brauche zu tragen auf die Methode:

Peru | Japan | Method 
1 | 3  | m1 
2 | 4  | m4 

Danke für die Hilfe!

+1

'X.pivot ('Methode', ' Land "," Wert ")"? Warum hast du 'M4' obwohl? – Psidom

Antwort

1

Sie .pivot-X Folge von .reset_index

Ich habe entfernen auch den Namen der Spalten für sauberere Ausgabe anwenden müssen.

df = X.pivot(index='method',columns='country',values='value').reset_index() 
df.columns.name = '' 
print(df) 

Ausgang:

method Japan Peru 
0  m1  3  1 
1  m2  4  2 
0

Lösung mit set_index und unstack:

print (X.set_index(['method','country'])['value'] 
     .unstack(fill_value=0) 
     .rename_axis(None, axis=1) 
     .reset_index()) 

    method Japan Peru 
0  m1  3  1 
1  m2  4  2 

aber wenn Fehler bekommen (weil Duplikate in Paar method, country Spalten):

ValueError: Index contains duplicate entries, cannot reshape

Lösung mit groupby und einige Aggregatfunktion wie mean (sum ...)

X = pd.DataFrame({'country':['Peru','Peru','Peru','Japan'], 
        'method':['m1','m2','m1','m2'], 
        'value':[1,2,3,4]}) 
print (X) 
    country method value 
0 Peru  m1  1 
1 Peru  m2  2 
2 Peru  m1  3 <-duplicates Peru, m1 
3 Japan  m2  4 

print (X.groupby(['method','country'])['value'].mean() 
     .unstack(fill_value=0) 
     .rename_axis(None, axis=1) 
     .reset_index()) 

    method Japan Peru 
0  m1  0  2 
1  m2  4  2 

Oder pivot_table mit Standard aggfunc=np.mean:

print (X.pivot_table(index='method', 
        columns='country', 
        values='value', 
        fill_value=0, 
        aggfunc=np.mean). 
        rename_axis(None, axis=1). 
        reset_index()) 

    method Japan Peru 
0  m1  0  2 
1  m2  4  2