2016-10-31 7 views
0

Bitte versuchen, den Grund des folgenden read_csv Verhalten zu verstehen: Ich versuche, eine große Datei in Stücke zu lesenPandas read_csv seltsame Verhalten

c=1 
for chunk in pd.read_csv(filename, chunksize=chunksize): 
    print 'chunk ', str(c), ' started' 
    ....data normalization.... 
    ....saving the transformed data to file.... 

ich einen Fehler wie diese:

sys:1: DtypeWarning: Columns (...) have mixed types. Specify dtype option on import or set low_memory=False. 
chunk 19 started 
Traceback (most recent call last): 
... 
TypeError: unsupported operand type(s) for -: 'str' and 'float' 

von dem Fehler kann ich sehen, dass aus irgendeinem Grund bei Chunk 19 Pandas die Float-Daten als String interpretiert, und kann nicht ausführen '-' Operation.

Allerdings, wenn ich 18 Brocken überspringe, und von Brocken 19 beginnt, geht es gut. Intuition sagt, es könnte ein Speicherproblem sein, aber ich würde gerne den Grund verstehen.

+0

Haben Sie versucht, "dingoption angeben" anzugeben? –

+0

z.B. 'dtype = {'Spalte1': np.float64, 'Spalte2: np.int32}' –

Antwort

1

Es ist kein Speicherproblem.

Pandas macht Vermutungen darüber, was die Datentypen sein sollten, wenn Sie das Argument dtype nicht angeben. Manchmal erkennt es, dass es einen Fehler gemacht hat, und wandelt den Datentyp einer Spalte im laufenden Betrieb um, wenn sie das für richtig hält. In diesem Fall scheint es so zu sein, dass der richtige Typ ein numerischer Typ ist, und später, wenn er auf einige Daten trifft, die ihn glauben machen, dass die Spalte wirklich Strings sein sollte und konvertiert. Haben die Daten irgendetwas wie 'N/A' drin?

Geben Sie einfach das dtype Argument an. Es wird die read_csv schneller und effizienter machen, und Sie werden entweder das Problem beheben oder eine bessere Vorstellung davon bekommen, was es verursacht.

+0

Nein, keine Chance für n/a. Es gab eine Chance für einige Strings, aber am Ende wurden ALLE Chunks korrekt verarbeitet (beim Überspringen von Chunks, die bereits beim vorherigen Lauf verarbeitet wurden). Wenn ich das Argument dtype angeben, wird der Fehler wie folgt ausgegeben: falscher Typ für float64: 0,0,0,0,0,0,0,0. ... – Vitaliy