2016-08-20 9 views
0

Ich benutzte die pandas.pivot_table Funktion auf einem Pandas Datenrahmen und meine Ausgabe sieht aus wie etwas simillar dazu:Pandas Pivot-Tabellen Formatierung Spaltennamen

    Winners     Runnerup    
     year  2016 2015 2014 2016 2015 2014 
Country Sport        
india badminton        
india wrestling 

Was ich brauchte eigentlich ein Ding wie unten

war
Country Sport Winners_2016 Winners_2015 Winners_2014 Runnerup_2016 Runnerup_2015 Runnerup_2014 
india badminton 1 1 1 1 1 1 
india wrestling 1 0 1 0 1 0 

Ich habe viele Spalten und Jahre, also kann ich sie nicht manuell bearbeiten, also kann mir bitte jemand sagen, wie man das macht?

Antwort

3

Sie auch Liste Verständnis verwenden können:

df.columns = ['_'.join(col) for col in df.columns] 
print (df) 
        Winners_2016 Winners_2015 Winners_2014 Runnerup_2016 \ 
Country Sport                 
india badminton    1    1    1    1 
     wrestling    1    1    1    1 

        Runnerup_2015 Runnerup_2014 
Country Sport          
india badminton    1    1 
     wrestling    1    1 

Eine andere Lösung mit convert columnsto_series und join rufen dann:

df.columns = df.columns.to_series().str.join('_') 
print (df) 
        Winners_2016 Winners_2015 Winners_2014 Runnerup_2016 \ 
Country Sport                 
india badminton    1    1    1    1 
     wrestling    1    1    1    1 

        Runnerup_2015 Runnerup_2014 
Country Sport          
india badminton    1    1 
     wrestling    1    1 

war ich wirklich daran interessiert, über Timings:

In [45]: %timeit ['_'.join(col) for col in df.columns] 
The slowest run took 7.82 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 4.05 µs per loop 

In [44]: %timeit ['{}_{}'.format(x,y) for x,y in zip(df.columns.get_level_values(0),df.columns.get_level_values(1))] 
The slowest run took 4.56 times longer than the fastest. This could mean that an intermediate result is being cached. 
10000 loops, best of 3: 131 µs per loop 

In [46]: %timeit df.columns.to_series().str.join('_') 
The slowest run took 4.31 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 452 µs per loop 
+0

Wirklich interessiert - das Verständnis der ersten Liste ist 30 mal schneller. – jezrael

+0

Ja, es ist wirklich hilfreich, da ich mit viel größeren Datensätzen zu tun habe. Vielen Dank! –

1

Versuchen Sie folgendes:

df.columns=['{}_{}'.format(x,y) for x,y in zip(df.columns.get_level_values(0),df.columns.get_level_values(1))] 

get_level_values ist, was Sie nur eine der Ebenen der resultierenden Multiindex erhalten müssen.

Seitennotiz: Sie könnten versuchen, mit den Daten so zu arbeiten, wie sie sind. Ich hasste lange Zeit Pandas MultiIndex, aber es ist auf mir gewachsen.

Verwandte Themen