Bei der Verarbeitung einer großen Datenmenge mit Pandas Es dauert oft zehn Minuten bis Stunden, um ein paar GB zu verarbeiten, und Tage, wenn Sie nicht gut darin sind. Wenn die Verarbeitung langsam ist, wird die weitere Arbeit nicht fortgesetzt Beachten Sie, wie Sie mit einer einfachen Änderung des Quellcodes beschleunigen können
index | name | weight | height |
---|---|---|---|
0 | Tanaka | 160.1 | 60.1 |
1 | Suzuki | 172.4 | 75.0 |
2 | Saitou | 155.8 | 42.2 |
... | |||
999998 | Morita | 167.9 | 94.07 |
999999 | Satou | 177.7 | 80.3 |
Zum Beispiel, wenn Sie einen Datenrahmen wie den oben genannten haben Bei der Berechnung des Durchschnittswerts von Gewicht und Größe scheint der Prozess wie folgt beschrieben zu werden.
Schlechtes Muster
import pandas as pd
sr_means = df.mean()
mean_height = sr_means['height']
mean_weight = sr_means['weight']
Aufgrund des Spaltennamens, der die Zeichenfolge enthält, dauert die Berechnung des obigen Codes jedoch sehr lange
Durch Ändern der Beschreibung wie unten gezeigt wird die Verarbeitung um Größenordnungen schneller.
Gutes Muster
import pandas as pd
sr_means = df[['height', 'weight']].mean()
mean_height = sr_means['height']
mean_weight = sr_means['weight']
Nachtrag: Gutes Muster
import pandas as pd
sr_means = df.mean(numeric_only = True)
mean_height = sr_means['height']
mean_weight = sr_means['weight']
Messen Sie tatsächlich die Zeit
Tatsächliche Messung
import pandas as pd
import numpy as np
N = 100000
df_test = pd.DataFrame(
{
'name':['abc'] * N,
'weight': np.random.normal(60, 5, N),
'height': np.random.normal(160, 5, N)
}
)
print("df_test.mean()")
%time df_test.mean()
print("df_test[['height', 'weight']].mean()")
%time df_test[['height', 'weight']].mean()
Die obigen Ergebnisse sind unten. Letzteres ist etwa vier Größenordnungen schneller, selbst wenn man bedenkt, dass die Anzahl der zu berechnenden Spalten um eins reduziert wird.
Ergebnis
df_test.mean()
Wall time: 3.06 s
df_test[['height', 'weight']].mean()
Wall time: 4 ms
Wenn Sie beispielsweise das Spaltengewicht auf eine Ganzzahl runden möchten, können Sie die Rundungsfunktion verwenden. Wenn Sie mit Python und dem heutigen Schreiben nicht vertraut sind, schreiben Sie in der Regel mit der for-Anweisung. Verwenden wir die Funktionszuordnung höherer Ordnung. (Ich werde die Funktion höherer Ordnung in diesem Artikel weglassen.)
Schlechtes Muster
#Wenden Sie die Rundungsfunktion auf das Element an
for idx in range(len(df_test['weight'].index)):
df_test['weight'][idx] = round(df_test['weight'][idx])
Schreiben Sie unten mit Karte neu
Gutes Muster
#Wenden Sie die Rundungsfunktion auf das Element an
df_test['weight'] = df_test['weight'].map(round)
Ich werde diesmal auch die Zeit messen. Da die for-Anweisung zu langsam ist, reduzieren Sie die Anzahl der Daten
Tatsächliche Messung
def func(sr):
for idx in range(len(sr.index)):
sr[idx] = round(sr[idx])
return(sr)
N = 1000
df_test = pd.DataFrame(
{
'name':['abc'] * N,
'weight': np.random.normal(60, 5, N),
'height': np.random.normal(160, 5, N)
}
)
print("Für für")
%time df_test['weight'] = func(df_test['weight'])
print("Für Karte")
%time df_test['weight'] = df_test['weight'].map(round)
Das Ergebnis ist unten. Was eine Karte mit Lichtgeschwindigkeit verarbeiten kann, wird mit einer for-Anweisung lächerlich langsam Weil dies nur 100 Daten sind Es ist beängstigend, wenn Sie über den Umgang mit 1 bis 100 Millionen Daten nachdenken
Ergebnis
Für für
Wall time: 22.1 s
Für Karte
Wall time: 0 ns
Nur durch die Verbesserung der beiden oben genannten Prozesse Früher dauerte die Verarbeitung von Daten einen Tag, jetzt kann sie in wenigen Minuten verarbeitet werden. Ich möchte es stetig verbessern.