Pandas DataFrame.merge MemoryError
Ziel
Mein Ziel ist es, Zusammenführen von zwei DataFrames durch Ihre gemeinsame Spalte (gen-Namen), so kann ich ein Produkt jedes gen score über jedes gen Reihe. Ich würde dann einen groupby
auf Patienten und Zellen und der Summe aller Punktzahlen von jedem. Die ultimative Daten-frame sollte dann so Aussehen:
patient cell
Pat_1 22RV1 12
DU145 15
LN18 9
Pat_2 22RV1 12
DU145 15
LN18 9
Pat_3 22RV1 12
DU145 15
LN18 9
Dass Letzte Teil sollte funktionieren, aber ich habe nicht in der Lage zu führen Sie die ersten merge-auf die gen-Namen durch einen MemoryError
. Unten sind Ausschnitte von jeder DataFrame.
Daten
cell_s =
Description Name level_2 0
0 LOC100009676 100009676_at LN18_CENTRAL_NERVOUS_SYSTEM 1
1 LOC100009676 100009676_at 22RV1_PROSTATE 2
2 LOC100009676 100009676_at DU145_PROSTATE 3
3 AKT3 10000_at LN18_CENTRAL_NERVOUS_SYSTEM 4
4 AKT3 10000_at 22RV1_PROSTATE 5
5 AKT3 10000_at DU145_PROSTATE 6
6 MED6 10001_at LN18_CENTRAL_NERVOUS_SYSTEM 7
7 MED6 10001_at 22RV1_PROSTATE 8
8 MED6 10001_at DU145_PROSTATE 9
cell_s ist ungefähr 10.000.000 Zeilen
patient_s =
id level_1 0
0 MED6 Pat_1 1
1 MED6 Pat_2 1
2 MED6 Pat_3 1
3 LOC100009676 Pat_1 2
4 LOC100009676 Pat_2 2
5 LOC100009676 Pat_3 2
6 ABCD Pat_1 3
7 ABCD Pat_2 3
8 ABCD Pat_3 3
....
patient_s ist über 1.200.000 werden Zeilen
Code
def get_score(cell, patient):
cell_s = cell.set_index(['Description', 'Name']).stack().reset_index()
cell_s.columns = ['Description', 'Name', 'cell', 's1']
patient_s = patient.set_index('id').stack().reset_index()
patient_s.columns = ['id', 'patient', 's2']
# fails here:
merged = cell_s.merge(patient_s, left_on='Description', right_on='id')
merged['score'] = merged.s1 * merged.s2
scores = merged.groupby(['patient','cell'])['score'].sum()
return scores
War ich immer ein MemoryError, wenn zunächst die read_csv
ing diese Dateien, aber dann ist die Angabe der dtypes das Problem behoben. Mit der Bestätigung, dass meine python ist 64-bit nicht beheben mein Problem. Ich habe nicht erreicht, die Grenzen auf pandas habe ich?
Python-3.4.3 |Anaconda 2.3.0 (64-bit)| Pandas 0.16.2
- Spart man einiges an Speicher durch Umwandlung von strings zu categoricals, wenn Sie nicht bereits getan haben. Ich glaube nicht, dass 64-bit-pandas haben keine Speicher-Einschränkungen als das, was Ihr computer hat.
- Beim importieren mit 'read_csv' ich die 'dtype='Kategorie' für alle Spalten mit strings, die ich bekommen
TypeError: data type "category" not understood
. Ich denke, da Kategorisch nicht ein numpy-array. Können Sie daran denken, eine Arbeit um? Kann ich das einfach ignorieren MemoryError? - Ich glaube, Sie haben zu konvertieren nach Lesen. Ich usu etwas wie
df['x'] = df['x'].astype('category')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten zwei workarounds:
CSV Von CHUNKS
Offenbar read_csv können performance-Problemen leiden und deshalb große Dateien laden muss, in iterierten Brocken.
CSV VIA SQL
Als Datenbank-Typ, den ich immer empfehlen, das handling von großen Daten lädt und Zusammenführen/verbinden mit einer SQL relationale engine skaliert gut für solche Prozesse. Ich habe viele geschrieben einen Kommentar auf dataframe merge-Q/Als zu diesem Zweck -auch in R. Sie können jede SQL-Datenbank, einschließlich Datei-server-dbs (Access, SQLite) oder client-server-dbs (MySQL, MSSQL oder anderen), selbst wenn die dfs ableiten. Python verwaltet eine built-in-Bibliothek für SQLite (sonst Sie ODBC verwenden); und dataframes geschoben werden kann, die in Datenbanken, wie Tabellen mit pandas to_sql:
read_csv
in Stücke, und es scheint, verringern Sie die Speicherauslastung (obwohl ich noch nicht genau gemessen). Die SQL-Lösung sieht aus wie "der Weg", aber wenn ich den oben stehenden code ausführen, es wirft ein Attribut Fehler'sqlite3.Cursor' object has no attribute 'cursor'
beicells_s.to_sql
. Ich habe das Problem gelegen zu line 1467 vonpandas/io/sql.py
im ausführencur = self.con.cursor()
. Überprüft die Dokumente und SO, und konnte nicht feststellen, die Ursache des Fehlers. Irgendwelche Ideen?c = conn.cursor()
folgenden ein Beispiel aus der Sebastian Raschka. Scheint zu funktionieren für meine merge, aber ich wouldn nicht in der Lage, Abfrage meine neue Datenbank, richtig?con
argumentto_sql()
und nicht das connection-Objekt. Ich machte das Bearbeiten mit einer neuen Variablencxn
. Ja, Sie sollten in der Lage sein, um die db-Abfrage mit cursor execute() mit fetchall (), die Ausgänge in der Liste format. Beachten Sie aber in über -, Abfrage-Ergebnisse weitergegeben werden, in einen Pandabären df mit read_sql().Müssen Sie es in Stücke, oder schauen Sie in die Flamme. http://blaze.pydata.org