2017-05-17 3 views
0

ich einen großen Datenrahmen der folgenden Struktur aufweisen, die für den Zweck dieser Frage wird vereinfacht:Pandas- GROUPBY mehr Spalten und bedeuten, aus einer einzigen Spalte

A  B  C D ... J K 
    date1 time1 1 1 ... 1 1 
    date2 time2 2 2 ... 2 2 

im Wesentlichen der ersten 3 Spalten repräsentieren alle Kettendaten, dh Zeiten und Daten. Der Datenrahmen, den ich aus einer CSV-Datei einlese, und die Daten nach den Zeiten haben mehrere Punkte an einem einzelnen Tag für jede Spalte.

Ich möchte eine Möglichkeit finden, alle Daten nach Daten zu gruppieren und Durchschnittswerte pro Tag zu erstellen, die mehrere Datenpunkte an einem einzigen Tag berücksichtigen. Das ist schön unter Verwendung group.by (Termine) behandelt aber ich alle anderen Daten verlieren nicht in der Daten Spalte enthalten, so das Ergebnis ist wie folgt:.

Vor group.by() bedeuten():

A  B  C D ... J K 
    date1 time1 1 1 ... 1 1 
    date2 time2 2 2 ... 2 2 
    date2 time3 1 1 ... 1 1 

nach:

A  C D ... J K 
    date1 1 1  1 1 
    date2 1.5 1.5 ... 1.5 1.5 

Mein idealer Ausgang wäre es, die Daten in der Zeitspalte und Datumsspalten zu halten, während immer noch Mittelwert basierend Erstellung an den Tagen. Dies würde zu folgendem Ergebnis:

Ideal Ausgang:

A  B  C D ... J K 
    date1 time1 1 1  1 1 
    date2 time2 1.5 1.5 ... 1.5 1.5 

Antwort

1

Es gibt Problem, das Sie aggregierte Spalten mit strings und times zu müssen, zum Beispiel von first, sonst sind omited.

So mögliche Lösung ist dict of aggregation functions und groupby + agg + reset_index + reindex_axis verwenden erstellen:

print (df) 

    A  B  C D E J K 
0 a date1 time1 1 1 1 1 
1 b date2 time2 2 2 2 2 
2 c date2 time3 1 1 1 1 

cols = ['A','B','C'] 
d = {x:'mean' for x in df.columns.difference(cols)} 
d['A'] = 'first' 
d['C'] = 'first' 
print (d) 
{'E': 'mean', 'D': 'mean', 'J': 'mean', 'A': 'first', 'C': 'first', 'K': 'mean'} 

df1 = df.groupby('B').agg(d).reset_index().reindex_axis(df.columns, axis=1) 
print (df1) 
    A  B  C D E J K 
0 a date1 time1 1.0 1.0 1.0 1.0 
1 b date2 time2 1.5 1.5 1.5 1.5 
+1

Yep mit ein wenig zwicken mein Programm passen das ist, was ich für Dank suchen! – cd123

+0

Froh kann helfen, schöner Tag! – jezrael

Verwandte Themen