2017-11-15 3 views
2

Ich verstehe, dass einer der Gründe, warum Pandas relativ langsam importieren csv-Dateien ist, dass es den gesamten Inhalt einer Spalte vor dem Erraten des Typs (siehe die Diskussionen um die meist fragen müssen) veraltet low_memory Option für pandas.read_csv). Ist mein Verständnis richtig?So beschleunigen Sie den Import von Datenrahmen in Pandas

Wenn es ist, was wäre ein gutes Format, in dem ein Datenrahmen zu speichern, und die explizit Datentypen angibt, so Pandas muss nicht raten (SQL ist keine Option für jetzt)?

Jede Option insbesondere von those listed here?

Meine Datenrahmen haben Gleitkommazahlen, Ganzzahlen, Datumsangaben, Zeichenfolgen und Y/N, so dass Formate, die nur numerische Werte unterstützen, nicht ausreichen.

Danke!

Antwort

2

Eine Option besteht darin, numpy.genfromtxt mit delimiter=',', names=True zu verwenden und dann den Pandas-Datenrahmen mit dem numpy-Array zu initialisieren. Das Nummernfeld wird strukturiert und der Pandas-Konstruktor sollte automatisch die Feldnamen festlegen.

Meiner Erfahrung nach funktioniert das gut.

+0

auch für nicht-numerische Spalten (Strings, Daten, Y/N)? –

+0

Ich habe nur mit numerischen Daten gearbeitet (float64), also kann ich nicht sicher sein, aber ich erwarte trotzdem, dass es den direkten Import in Pandas übertrifft. – Shayn

1

Sie können die Effizienz beim Importieren aus einer CSV-Datei verbessern, indem Sie Spaltennamen und ihre Datentypen für Ihren Aufruf an pandas.read_csv angeben. Wenn Sie in der Datei vorhandenen Spaltenüberschriften haben, werden Sie wahrscheinlich haben nicht die Namen angeben und können nur diejenigen verwenden, aber Ich mag den Header überspringen und Namen für Vollständigkeit angeben:

import pandas as pd 
import numpy as np 
col_names = ['a', 'b', 'whatever', 'your', 'names', 'are'] 
col_types = {k: np.int32 for k in col_names} # create the type dict 
col_types['a'] = 'object' # can change whichever ones you like 
df = pd.read_csv(fname, 
       header = None, # since we are specifying our own names 
       skiprows=[0], # if you *do* have a header row, skip it 
       names=col_names, 
       dtype=col_types) 

Auf einer großen Probe Dataset bestehend aus meist ganzzahligen Spalten, das war ca. 20% schneller als die Angabe dtype='object' im Aufruf an pd.read_csv für mich.

1

Ich würde entweder HDF5-Format oder Feather Format berücksichtigen. Beide sind ziemlich schnell (Feather ist vielleicht schneller, aber HDF5 ist mehr funktionsreich - zum Beispiel das Lesen von Festplatte nach Index) und beide speichern die Art der Spalten, so dass sie nicht raten müssen dtypes und sie don 't t müssen beim Laden von Daten Datentypen (z. B. Zeichenfolgen in Zahlen oder Zeichenfolgen in Datumsangaben) konvertieren.

Hier sind einige Geschwindigkeitsvergleiche:

Verwandte Themen