Python - Effiziente Methode zum hinzufügen von Zeilen zu dataframe
Aus diesem Frage und andere, die es scheint, dass es nicht empfohlen zu verwenden concat
oder append
zu bauen, ein pandas dataframe, weil es Kopierens die ganze dataframe jeder Zeit.
Mein Projekt beinhaltet empfangen einer kleinen Menge von Daten, die alle 30 Sekunden. Dies könnte für einen 3-Tages-Wochenende, also könnte jemand einfach erwarten, dass über 8000 Zeilen erstellt werden, eine Zeile zu einem Zeitpunkt. Was wäre die effizienteste Methode zum hinzufügen von Zeilen zu diesem dataframe?
Wenn Sie nur das hinzufügen einer Zeile alle 30 Sekunden, ist es wirklich brauchen, um effizient zu sein?
Gibt es irgendeinen Grund muss es ein DataFrame? Warum nicht einfach schreiben es in eine Datei umwandeln und dann am Ende?
Rauch Gut, ich hatte gehofft, damit meine Proben so nahe zu alle 30 Sekunden wie möglich. Wahrscheinlich falsch, ich Hole die Daten dann, indem es der dataframe dann mit
Wenn Ihre Sorge ist, dass die 30-Sekunden-Schlaf wird ungenau, weil es länger dauert, zum Anhängen Ihrer Daten haben, dann beheben Sie den Schlaf.
Rauch-Oh, das ist eine tolle Idee!
Gibt es irgendeinen Grund muss es ein DataFrame? Warum nicht einfach schreiben es in eine Datei umwandeln und dann am Ende?
Rauch Gut, ich hatte gehofft, damit meine Proben so nahe zu alle 30 Sekunden wie möglich. Wahrscheinlich falsch, ich Hole die Daten dann, indem es der dataframe dann mit
time.sleep(30)
bis seine Zeit, um den nächsten Satz von Daten. Meine Sorge war, dass es größer wird, dass die Last der Zeit werden Sie beginnen, zu erweitern, die Zeit zwischen jeder Probe. Von dieser Frage link es scheint, dass bei einer Größe von 6000 dauert es 2.29 Sekunden. Ich möchte wenn möglich halten, dass die Anzahl auf ein minimum.Wenn Ihre Sorge ist, dass die 30-Sekunden-Schlaf wird ungenau, weil es länger dauert, zum Anhängen Ihrer Daten haben, dann beheben Sie den Schlaf.
next_time += 30, time.sleep(next_time-time.time())
Rauch-Oh, das ist eine tolle Idee!
InformationsquelleAutor Jarrod | 2017-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Zeilen hinzufügen, um ein DataFrame in-place-mithilfe
loc
auf ein nicht existierenden index. Aus der Pandas Dokumentation:Als erwartet, mit
loc
ist deutlich schneller alsappend
(etwa 14x):Etwas weniger hackish als angenommen index-nie existieren wird?
Natürlich das letztere ist schneller. Die erste iteration fügt eine neue Zeile und alle nachfolgenden Operationen schreiben in der gleichen Zeile mit dem index 3. Der index erhöht werden. Sie würden auch brauchen, df = df.append(df2), um den Vergleich fair.
InformationsquelleAutor sundance
Habe ich diese Antwort
df.loc[i] = [new_data]
Vorschlag, aber ich habe es > bei 500.000 Zeilen und das war sehr langsam.Während die Antworten, die gegeben werden, sind gute für die OP ' s Frage, ich fand es effizienter, wenn der Umgang mit einer großen Anzahl von Zeilen nach oben-front (anstelle der Täuschung in der beschriebenen durch die OP) zu verwenden csvwriter hinzufügen von Daten zu einer in-memory-CSV-Objekt, dann endlich mit
pandas.read_csv(csv)
zu generieren, die die gewünschte Ausgabe-DataFrame.Diese, für ~500,000 Zeilen war 1000x schneller und als die Zeilenanzahl wächst der Verbesserung der Geschwindigkeit wird nur noch größer (
the df.loc[1] = [data]
erhalten eine Menge langsamer vergleichsweise)Hoffe, dies hilft jemand, der Notwendigkeit, die Effizienz beim Umgang mit mehr Zeilen als die OP.
Könnte man alternativ, effiziente Nutzung einer in-memory-Struktur-oder CSV-Format, anstatt das schreiben einer CSV-Datei?
Nach meinem Verständnis, und das ist das, was der Autor eigentlich selbst sagt, wird dieser bereits im Speicher. So hart Sie zu schlagen. Ist das wirklich schneller als das Anhängen an eine Liste, und konvertieren?
Super!!! Ich habe das getestet und kann bestätigen, dass dies viel schneller.
Hinweis: für Python 3 müssen StringIO statt BytesIO
InformationsquelleAutor Tom Harvey
Müssen Sie split das problem in zwei Teile:
Wenn Ihre Daten nicht kritisch ist (das heißt, Sie sich nicht leisten können zu verlieren) - schicken Sie es an eine Warteschlange, und dann Lesen Sie es aus der Warteschlange in den Reihen.
Die Warteschlange zuverlässigen (garantiert) nach Annahme und, dass Ihre Daten nicht verloren gehen.
Lesen Sie die Daten aus der Warteschlange und es dump in eine Datenbank.
Nun Ihre Python-app einfach aus der Datenbank liest und nicht die Analyse an welchem Intervall macht Sinn für die Anwendung - vielleicht wollen Sie tun stundenmitteln; in diesem Fall führen Sie Ihr Skript jede Stunde, ziehen Sie die Daten aus der db und vielleicht schreiben die Ergebnisse in eine andere Datenbank /Tabelle /Datei.
Unten line - split das sammeln und analysieren von teilen der Anwendung.
InformationsquelleAutor Burhan Khalid
Vorausgesetzt, dass der dataframe ist indiziert, um Sie können:
Zuerst überprüfen, um zu sehen, was der nächste index-Wert zum erstellen einer neuen Zeile:
Verwenden Sie dann 'unter' schreiben Sie zu jeder gewünschten Spalte
InformationsquelleAutor sparrow