Erstellen Sie einen Pandas DataFrame vom Generator?

Ich habe einen Tupel-Generator, der Informationen aus einer Datei extrahiert nur die Datensätze von Interesse und Umwandlung in ein Tupel, dass Generator zurückgibt.

Ich habe versucht, ein DataFrame zu erstellen von:

import pandas as pd df = pd.DataFrame.from_records(tuple_generator, columns = tuple_fields_name_list) 

Aber wirft einen Fehler:

 ... C:\Anaconda\envs\py33\lib\site-packages\pandas\core\frame.py in from_records(cls, data, index, exclude, columns, coerce_float, nrows) 1046 values.append(row) 1047 i += 1 -> 1048 if i >= nrows: 1049 break 1050 TypeError: unorderable types: int() >= NoneType() 

Ich habe es geschafft, den Generator in einer Liste zu verbrauchen, verwendet aber zweimal Speicher:

 df = pd.DataFrame.from_records(list(tuple_generator), columns = tuple_fields_name_list) 

Die Dateien, die ich laden möchte, sind groß und der Speicherverbrauch ist wichtig. Der letzte Versuch mein Computer verbringt zwei Stunden versuchen, virtuellen Speicher zu erhöhen 🙁

Die Frage: Wer kennt eine Methode, um einen DataFrame von einem Plattengenerator direkt zu erstellen, ohne vorher in eine Liste umzuwandeln?

Hinweis: Ich benutze Python 3.3 und Pandas 0,12 mit Anaconda unter Windows.

Aktualisieren:

Es ist nicht das Problem, die Datei zu lesen, mein Tupel-Generator tut es gut, es scannt eine Text-komprimierte Datei von gemischten Datensätzen Zeile für Zeile und konvertieren nur die gewünschten Daten in die richtigen Typen, dann gibt es Felder in einem Generator von Tupel Form. Einige Zahlen, es scannt 2111412 Datensätze auf einer 130MB gzip Datei, ca. 6,5GB unkomprimiert, in etwa einer Minute und mit wenig Speicher verwendet.

Pandas 0.12 erlaubt keine Generatoren, dev Version erlaubt es aber stelle den ganzen Generator in eine Liste und dann in einen Rahmen umwandeln. Es ist nicht effizient, aber es ist etwas, das intern Pandas zu tun hat. Mittlerweile muss ich über etwas mehr Gedächtnis nachdenken.

4 Solutions collect form web for “Erstellen Sie einen Pandas DataFrame vom Generator?”

Sie können kein DataFrame aus einem Generator mit der 0.12 Version von Pandas erstellen. Sie können sich entweder auf die Entwicklungsversion aktualisieren (bekommen Sie es aus dem Github und kompilieren Sie es – das ist ein bisschen schmerzhaft auf Windows, aber ich würde diese Option bevorzugen).

Oder Sie können, da Sie gesagt haben, dass Sie die Zeilen filtern, zuerst filtern, sie in eine Datei schreiben und sie dann mit read_csv oder etwas anderes laden …

Wenn du super kompliziert werden willst, kannst du eine Datei wie Objekt erstellen, die die Zeilen zurückgibt:

 def gen(): lines = [ 'col1,col2\n', 'foo,bar\n', 'foo,baz\n', 'bar,baz\n' ] for line in lines: yield line class Reader(object): def __init__(self, g): self.g = g def read(self, n=0): try: return next(self.g) except StopIteration: return '' 

Und dann benutze die read_csv :

 >>> pd.read_csv(Reader(gen())) col1 col2 0 foo bar 1 foo baz 2 bar baz 

Um es zu bekommen, um effizient zu sein, lesen Sie in Chunks. Etwas ähnliches, mit Viktor's Reader Klasse von oben.

 df = pd.concat(list(pd.read_csv(Reader(gen()),chunksize=10000)),axis=1) 

Sie können sicherlich ein pandas.DataFrame() aus einem Generator von Tupeln, ab Version 19 (und wahrscheinlich früher) konstruieren. Verwenden Sie nicht .from_records() ; Verwenden Sie einfach den Konstruktor, zum Beispiel:

 import pandas as pd someGenerator = ( (x, chr(x)) for x in range(48,127) ) someDf = pd.DataFrame(someGenerator) 

Produziert:

 type(someDf) #pandas.core.frame.DataFrame someDf.dtypes #0 int64 #1 object #dtype: object someDf.tail(10) # 0 1 #69 117 u #70 118 v #71 119 w #72 120 x #73 121 y #74 122 z #75 123 { #76 124 | #77 125 } #78 126 ~ 

Sie können auch etwas wie (Python getestet in 2.7.5)

 from itertools import izip def dataframe_from_row_iterator(row_iterator, colnames): col_iterator = izip(*row_iterator) return pd.DataFrame({cn: cv for (cn, cv) in izip(colnames, col_iterator)}) 

Sie können dies auch anfügen, um Zeilen an ein DataFrame anzuhängen.

– Bearbeiten, 4. Dezember: s / Zeile / Zeilen in der letzten Zeile

  • Gibt es einen Unterschied in der Berechnung für Numpy vs Pandas?
  • Drop alle doppelten Zeilen in Python Pandas
  • Pandas melden Top-n in Gruppe und Pivot
  • Unterklassen von Pandas 'Objekt funktionieren anders als Unterklasse eines anderen Objekts?
  • Finden Sie einen Nullwert und fallen Sie von einem Dataframe in Pandas
  • Python Pandas Manipulation Dataframe
  • Vertikale Linie am Ende eines CDF-Histogramms mit matplotlib
  • Pandas reindexing Datenrahmen Problem
  • Euklidische Distanzmatrix mit Pandas
  • Pandas: oserror mit Akzent / Sonderzeichen in Dateipfad und Dateiname
  • Lesen der CSV-Datei in Pandas mit historischen Daten
  • Python ist die beste Programmiersprache der Welt.