2012-07-10 6 views
15

Ich habe eine Datendatei geerbt im Stata .dta-Format gespeichert. Ich kann es mit scikits.statsmodelsgenfromdta() Funktion laden. Dies bringt meine Daten in ein 1-dimensionales NumPy-Array, wobei jeder Eintrag eine Zeile von Daten ist, die in einem 24-Tupel gespeichert sind.Erstellen Sie effizient Pandas DataFrame aus einer großen Liste von Tupeln/Zeilen

In [2]: st_time = time.time(); initialload = sm.iolib.genfromdta("/home/myfile.dta"); ed_time = time.time(); print (ed_time - st_time) 
666.523324013 

In [3]: type(initialload) 
Out[3]: numpy.ndarray 

In [4]: initialload.shape 
Out[4]: (4809584,) 

In [5]: initialload[0] 
Out[5]: (19901130.0, 289.0, 1990.0, 12.0, 199.0, 18.0, 40301000.0, 'GB', 18242.0, -2.368063, 1.0, 1.7783716290878204, 4379.355, 66.17669677734375, -999.0, -999.0, -0.60000002, -999.0, -999.0, -999.0, -999.0, -999.0, 0.2, 371.0) 

Ich bin gespannt, ob es eine effiziente Möglichkeit gibt, dies in einen Pandas DataFrame zu arrangieren. Nach dem, was ich gelesen habe, scheint der Aufbau eines DataFrame Zeile für Zeile ziemlich ineffizient zu sein ... aber was sind meine Optionen?

Ich habe einen ziemlich langsamen First-Pass geschrieben, der jedes Tupel als Single-Row-Datenframe liest und anfügt. Ich frage mich nur, ob etwas anderes als besser bekannt ist.

+0

Hat 'pandas.DataFrame (initialload)' zurückgeben, was Sie suchen? – eumiro

+0

Wow. Fast. Es hat ein paar Spaltennamen vermasselt, aber das kann ich leicht beheben. Verrückt. Danke, das hätte ich mir auch nach dem Lesen der Pandas-Dokumente nie erraten. Entschuldigung, das war so einfach. – ely

Antwort

19

Wenn mein Kommentar Ihre Frage beantwortet, ist meine Antwort nicht auf es zu kommentieren hat jede ... ;-)

pandas.DataFrame(initialload, columns=list_of_column_names) 
3

Version 0.12 von Pandas sollte weiter unterstützen direkt Stata-Format zu laden (Reference).

Aus der Dokumentation:

Die Top-Level-Funktion read_stata eine DTA-Format-Datei und gibt einen Datenrahmen lesen: Die Klasse StataReader die Header der gegebenen dta-Datei bei der Initialisierung gelesen wird. Seine Methode Daten() werden die Beobachtungen lesen, um sie zu einem Datenrahmen umzuwandeln, die zurückgegeben wird:

pd.read_stata('stata.dta')