2017-08-16 1 views
2

Aufgrund der großen Datenmenge verwendeten wir Pandas, um Daten zu verarbeiten, aber ein sehr seltsames Phänomen trat auf. Der Pseudocode sieht so aus:seltsamer Indizierungsmechanismus der Funktion pandas.read_csv mit Chunksize-Option

Wir können bestätigen, dass jede Schleife des Ergebnisses nicht leer ist. Aber nur in der ersten Zeit der Schleife hat Zeile chunk['new_series'] = pd.series(result) Ergebnis, der Rest ist leer. Daher enthält nur der erste Chunk der Ausgabe new_series, der Rest ist leer.

Haben wir hier etwas übersehen? Danke im Voraus.

Antwort

3

Sie sollten result oberhalb Ihrer Schleife deklarieren, sonst initialisieren Sie es einfach mit jedem Chunk neu.

result = [] 
for chunk in reader: 
    ... 

Sie bisherige Methode ist funktional äquivalent zu:

for chunk in reader: 
    del result # because it is being re-assigned on the following line. 
    result = [] 
    result.append(something) 
print(result) # Only shows result from last chunk in reader (the last loop). 

Auch würde ich empfehlen:

chunk = chunk.assign(new_series=result) # Instead of `chunk['new_series'] = pd.series(result)`. 

ich Dir gehe davon aus in Ihrem for loop etwas mit dem line Variable tun, obwohl es in Ihrem obigen Beispiel nicht verwendet wird.

+1

Vielen Dank. Ja, dein Vorschlag hat funktioniert. Aber ich verstehe nicht, warum das Verschieben von Ergebnis = [] außerhalb funktioniert. Das ist sehr peinlich für mich. Kannst du ein wenig weiterarbeiten? Danke vielmals! – acepor

+0

Danke für die Erklärung. Aber genau das hat das Problem verursacht. Als wir die Indexierung jedes einzelnen Blocks verfolgten, stellte ich fest, dass sie nicht individuell sind. Wir nahmen an, dass jeder Chunk den Index von 0 aus starten würde, aber in Wirklichkeit ist es NICHT. Der Index jedes Chunks ist in dieser Situation eine Teilmenge der gesamten CSV, sodass ihr Index von der CSV abgeleitet wird. Dies hat das Problem verursacht. Im obigen Beispiel schreibt das 'pandas.to_csv' nur das Ergebnis des ersten Chunks anstelle des letzten Chunks. Aber ich würde immer noch für deine Inspiration danken; Ansonsten wusste ich wirklich nicht, wie ich das lösen sollte. – acepor

+0

Haben Sie meine Empfehlung 'chunk = chunk.assign (new_series = result)' verwendet? Ich glaube nicht, dass Sie dieses Problem damit hätten. – Alexander

1

Eine bessere Lösung wäre dies:

reader = pd.read_csv(IN_FILE, chunksize = 1000, engine='c') 
for chunk in reader: 
    result = [] 
    for line in chunk.tolist(): 
     temp = complicated_process(chunk) # this involves a very complicated processing, so here is just a simplified version 
     result.append(temp) 
    new_chunk = chunk.reset_index() 
    new_chunk = new_chunk.assign(new_series=result) 
    new_chunk.to_csv(OUT_TILE, index=False, mode='a') 

Hinweis: der Index jedes Chunk ist nicht individuell, sondern die gesamte Datei abgeleitet. Wenn wir eine neue Reihe aus jeder Schleife anhängen, erbt der Chunk den Index von der ganzen Datei. Daher stimmt der Index jedes Chunks und der neuen Serie nicht überein.

Die Lösung von @Alexander funktioniert, aber die result könnte sehr groß werden, so dass es zu viel Speicher belegen wird.

Die neue Lösung hier wird den Index für jeden Chunk zurücksetzen, indem new_chunk = chunk.reset_index() getan wird, und result wird innerhalb jeder Schleife zurückgesetzt. Dies spart viel Speicher.

Verwandte Themen