2016-06-16 2 views
1

Ich habe eine Tabelle von Benutzern mit, wie viel sie jeden Tag ausgeben. Ich möchte sie in nur einer Zeile pro Benutzer neu anordnen, wobei die Spalten angeben, wie viel sie jeden Tag ausgeben.Kombinieren mehrerer Pandas Zeilen in einen einzigen Datensatz mit verschiedenen Überschriften

user_id day spending 

111  mon  15 
111  tues  20 
111  weds  25 
.... 
122  mon  44 
122  tues  34 
122  weds  90 
122  thurs  26 
.... 

Ich mag

die Tabelle in das Formular zum Einsturz
id  mon tues weds thurs fri sat sun  

111 15 20 25 16 48 32 40 
122 44 34 90 26 20 22 53 

Gerade jetzt dieser Code initialisiert die täglichen Spalten (Mo, Di, vermählt ... etc) als Nullen, dann setzt es die tägliche Ausgaben Daten in jeder Spalte in der for-Schleife, alle außer die Ausgaben an diesem Tag sollten Nullen sein, was zu einer diagonalen Matrix sucht Tabelle. Dann summiere ich die ganze Sache, um alle Werte in einem einzigen Zeilensatz zu füllen. Gerade jetzt dieser Code funktioniert auf einer kleinen Datenmenge, aber die for-Schleife ist eine lange Zeit auf meinem vollständigen Datensatz unter:

for i,hr in zip(np.arange(len(df)),df['day']): 
    df.ix[i,hr]=df1_subset.ix[i,"spending"] 
# aggregate the users by id and dates 
df = df.groupby('id').sum() 

Was für eine Art und Weise, dass ich noch einige Pandas-korrekte Operationen verwenden könnte, wo ich das vermeiden kann for-Schleife oder machen Sie das schneller?

Danke.

Antwort

2
df.pivot(index='user_id', columns='day').fillna(0) 
Out[50]: 
     spending     
day   mon thurs tues weds 
user_id       
111   15  0 20 25 
122   44 26 34 90 

sein Oder wenn Sie maßgeschneiderte Aggregationsfunktionen möchten, verwenden Sie pivot_table:

table = pd.pivot_table(df, index='user_id', columns='day', aggfunc=np.sum) 

table 
Out[53]: 
     spending     
day   mon thurs tues weds 
user_id       
111   15 NaN 20 25 
122   44 26 34 90 
1

Sie können DataFrame.pivot verwenden, um dies zu erreichen. Wenn Sie die Tabelle in einem Datenrahmen df Namen speichern dann würde der Code

Table = df.pivot(index='userid',columns='day',values='spending') 
Verwandte Themen