2017-01-31 7 views
2

Ich habe eine Tabelle wie diese.Kopfzeile in Zeile konvertieren

user 01/12/15 02/12/15 someBool 
u1  100   300  true 
u2  200  -100  false 
u3  -50   200  true 

Ich möchte die Datumsspalten in zwei Spalten date und value wie folgt neu zu partitionieren.

user date  value someBool 
u1  01/12/15 100  true 
u1  02/12/15 300  true 
u2  01/12/15 200  false 
u2  02/12/15 -100  false 
u3  01/12/15 50  true 
u3  02/12/15 200  true 

Wie geht das in Python? Ist pivot_table in pandas hilfreich?

Geben Sie nach Möglichkeit Code/psuedo-Code & geben Sie Details zur Python-Version.

Antwort

5

Sie benötigen melt:

df = pd.melt(df, id_vars=['user','someBool'], var_name='date') 
print (df) 
    user someBool  date value 
0 u1  True 01/12/15 100 
1 u2 False 01/12/15 200 
2 u3  True 01/12/15 -50 
3 u1  True 02/12/15 300 
4 u2 False 02/12/15 -100 
5 u3  True 02/12/15 200 

Eine andere Lösung mit stack:

df = df.set_index(['user','someBool']) 
     .stack() 
     .reset_index(name='value') 
     .rename(columns={'level_2':'date'}) 
print (df) 
    user someBool  date value 
0 u1  True 01/12/15 100 
1 u1  True 02/12/15 300 
2 u2 False 01/12/15 200 
3 u2 False 02/12/15 -100 
4 u3  True 01/12/15 -50 
5 u3  True 02/12/15 200 
3

numpy das Ganze rekonstruieren

id_vars = ['user', 'someBool'] 

the_rest = df.columns.difference(id_vars).tolist() 
m, n = len(df), len(the_rest) 
var_slc = np.arange(m).repeat(n) 

pd.DataFrame(
    np.hstack([ 
      df[id_vars].values[var_slc], 
      np.tile(the_rest, m)[:, None], 
      df[the_rest].values.reshape(-1, 1) 
     ]), columns=id_vars + ['date', 'value'] 
) 

    user someBool  date value 
0 u1  True 01/12/15 100 
1 u1  True 02/12/15 300 
2 u2 False 01/12/15 200 
3 u2 False 02/12/15 -100 
4 u3  True 01/12/15 -50 
5 u3  True 02/12/15 200 
Verwandte Themen