448 Stimmen

Wie man ein Pandas-Dataframe reversibel auf die Festplatte speichert und lädt

Im Moment importiere ich jedes Mal, wenn ich das Skript ausführe, ein recht großes CSV als DataFrame. Gibt es eine gute Lösung, um das DataFrame dauerhaft zwischen den Durchläufen verfügbar zu halten, damit ich nicht die ganze Zeit damit verbringen muss, auf das Skript zu warten?

659voto

Andy Hayden Punkte 324102

Der einfachste Weg ist es, es mit pickle zu speichern, indem Sie to_pickle verwenden:

df.to_pickle(file_name)  # wohin gespeichert werden soll, normalerweise als .pkl

Dann können Sie es wieder laden:

df = pd.read_pickle(file_name)

_Hinweis: Vor 0.11.1 save und load waren der einzige Weg, um dies zu tun (sie sind jetzt veraltet zugunsten von to_pickle bzw. read_pickle)._


Eine weitere beliebte Wahl ist die Verwendung von HDF5 (pytables), das sehr schnelle Zugriffszeiten für große Datensätze bietet:

import pandas as pd
store = pd.HDFStore('store.h5')

store['df'] = df  # speichern
store['df']  # laden

Weitere fortgeschrittene Strategien werden im Kochbuch diskutiert.


Seit 0.13 gibt es auch msgpack, das für Interoperabilität möglicherweise besser geeignet ist, als schnellere Alternative zu JSON, oder wenn Sie Python-Objekt-/Text-lastige Daten haben (siehe diese Frage).

136voto

agold Punkte 5930

Auch wenn es bereits einige Antworten gibt, habe ich einen interessanten Vergleich gefunden, in dem sie mehrere Möglichkeiten ausprobiert haben, Pandas DataFrames zu serialisieren: Efficiently Store Pandas DataFrames.

Sie vergleichen:

  • pickle: ursprüngliches ASCII-Datenformat
  • cPickle, eine C-Bibliothek
  • pickle-p2: verwendet das neuere Binärformat
  • json: standardmäßige json-Bibliothek
  • json-no-index: wie json, aber ohne Index
  • msgpack: binäre JSON-Alternative
  • CSV
  • hdfstore: HDF5-Speicherformat

In ihrem Experiment serialisieren sie ein DataFrame mit 1.000.000 Zeilen mit den beiden separat getesteten Spalten: eine mit Textdaten, die andere mit Zahlen. Ihr Haftungsausschluss besagt:

Sie sollten nicht davon ausgehen, dass das, was folgt, auf Ihre Daten verallgemeinerbar ist. Sie sollten Ihre eigenen Daten betrachten und Benchmarks selbst ausführen

Der Quellcode für den Test, auf den sie sich beziehen, ist online verfügbar hier. Da dieser Code nicht direkt funktionierte, habe ich einige geringfügige Änderungen vorgenommen, die Sie hier erhalten können: serialize.py Ich habe folgende Ergebnisse erhalten:

Vergleich der Zeit für die Ergebnisse

Sie erwähnen auch, dass die Serialisierung mit der Umwandlung von Textdaten in kategorische Daten viel schneller ist. In ihrem Test etwa 10-mal schneller (siehe auch den Testcode).

Bearbeiten: Die höheren Zeiten für pickle im Vergleich zu CSV können durch das verwendete Datenformat erklärt werden. Standardmäßig verwendet pickle eine druckbare ASCII-Repräsentation, die größere Datensätze generiert. Wie jedoch aus dem Diagramm ersichtlich ist, hat pickle unter Verwendung des neueren binären Datenformats (Version 2, pickle-p2) deutlich geringere Ladezeiten.

Weitere Referenzen:

39voto

Noah Punkte 19254

Wenn ich das richtig verstehe, verwenden Sie bereits pandas.read_csv() und möchten den Entwicklungsprozess beschleunigen, damit Sie die Datei nicht jedes Mal laden müssen, wenn Sie Ihr Skript bearbeiten, stimmt das? Ich habe ein paar Empfehlungen:

  1. Sie könnten nur einen Teil der CSV-Datei mit pandas.read_csv(..., nrows=1000) laden, um nur den oberen Teil der Tabelle zu laden, während Sie die Entwicklung durchführen

  2. verwenden Sie ipython für eine interaktive Sitzung, so dass Sie die Pandas-Tabelle im Speicher behalten, während Sie Ihr Skript bearbeiten und neu laden.

  3. konvertiere das csv in eine HDF5-Tabelle

  4. aktualisiert Verwenden Sie DataFrame.to_feather() und pd.read_feather(), um die Daten im R-kompatiblen feather Binärformat zu speichern, das super schnell ist (bei mir etwas schneller als pandas.to_pickle() bei numerischen Daten und bei Zeichendaten viel schneller).

Sie könnten auch an dieser Antwort auf Stackoverflow interessiert sein.

31voto

Anbarasu Punkte 609

Gurke funktioniert gut!

import pandas as pd
df.to_pickle('123.pkl')    # um das DataFrame df als 123.pkl zu speichern
df1 = pd.read_pickle('123.pkl') # um 123.pkl wieder in das DataFrame df zu laden

12voto

Huanyu Liao Punkte 137

Sie können die Federformatdatei verwenden. Es ist extrem schnell.

df.to_feather('dateiname.ft')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X