Berechnen Sie die Durchschnittliche, von jedem x Zeilen in einer Tabelle und neue Tabelle erstellen
Ich habe eine lange Tabelle von Daten (~200 Zeilen und 50 Spalten), und die muss ich erstellen einen code, kann die Berechnung der Mittelwerte alle zwei Zeilen und für jede Spalte in der Tabelle mit den endgültigen Ausgang wird eine neue Tabelle der Mittelwerte. Dies ist offensichtlich verrückten zu tun, in Excel! Ich benutze Python ist3, und ich bin bewusst, dass einige ähnliche Fragen:hier, hier und hier. Doch nichts davon hilft, da brauche ich etwas eleganter code für die Arbeit mit mehreren Spalten und erzeugt eine organisierte Daten-Tabelle. Übrigens meine ursprüngliche Datentabelle importiert wurde mit pandas und ist definiert als ein dataframe aber konnte nicht finden einen einfachen Weg, dies zu tun in der pandas. Hilfe ist sehr willkommen.
Ein Beispiel für die Tabelle (kurze version) ist:
a b c d
2 50 25 26
4 11 38 44
6 33 16 25
8 37 27 25
10 28 48 32
12 47 35 45
14 8 16 7
16 12 16 30
18 22 39 29
20 9 15 47
Erwartet meine Tabelle:
a b c d
3 30.5 31.5 35
7 35 21.5 25
11 37.5 41.5 38.5
15 10 16 18.5
19 15.5 27 38
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen, die eine künstliche Gruppe mit
df.index//2
(oder wie @DSM wies darauf hin, mitnp.arange(len(df))//2
- so dass es funktioniert für alle Indizes) und verwenden Sie groupby:np.arange(len(df))//2
statt, falls der index nicht einfach 0,1,2.. usw.df.groupby(np.arange(len(df.index))//2).mean()
😉NumPythonic Möglichkeit wäre, extrahieren Sie die Elemente als ein NumPy-array mit
df.values
, dann Umformen zu einer3D
array mit2
Elemente entlangaxis=1
und4
entlangaxis=2
und führen Sie die Durchschnittliche Reduzierung entlangaxis=1
und schließlich wieder zurück konvertieren, um einen dataframe, wie soAls es stellt sich heraus, Sie können sich vorstellen, NumPy ist sehr effizientes Werkzeug :
np.einsum
dazuaverage-reduction
als eine Kombination vonsum-reduction
undscaling-down
wie soBitte beachten Sie, dass die vorgeschlagenen Ansätze davon ausgehen, dass die Anzahl der Zeilen ist teilbar durch
2
.Auch als
bereits von @DSM
, zu bewahren den Namen der Spalten, die Sie hinzufügen möchtencolumns=df.columns
bei der Konvertierung zurück zu Dataframe an, d.h. -Probe Gefahren -
Laufzeit-tests -
In diesem Abschnitt testen wir, alle drei Ansätze aufgeführt, so weit um das problem zu lösen, für die Leistung, einschließlich
@ayhan Lösung mit groupby
.columns=df.columns
um dies zu korrigieren.Können Sie Ansatz, dieses problem mit
pd.rolling()
zu erstellen, die einen Laufenden Durchschnitt und dann nehmen Sie einfach jedes zweite element mitiloc
Beachten Sie, dass die erste Beobachtung fehlt (d.h. die Walzen beginnt an der Spitze)