Pandas DataFrame.merge MemoryError
目标
我的目标是通过它们的共同列(基因名称)合并两个DataFrame,这样我就可以在每个基因行中获取每个基因得分的乘积。 然后,我会对患者和细胞进行
1 2 3 4 5 6 7 8 9 10 | 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 |
最后一部分应该可以正常工作,但由于
数据
cell_s =
1 2 3 4 5 6 7 8 9 10 | 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约为10,000,000行
patient_s =
1 2 3 4 5 6 7 8 9 10 11 | 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约为1,200,000行
码
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
最初
Python 3.4.3 | Anaconda 2.3.0(64位)| 熊猫0.16.2
考虑两个解决方法:
CSV By CHUNKS
显然,read_csv可能会遇到性能问题,因此大文件必须以迭代的块加载。
1 2 3 4 5 6 7 | cellsfilepath = 'C:\\Path\To\Cells\CSVFile.csv' tp = pd.io.parsers.read_csv(cellsfilepath, sep=',', iterator=True, chunksize=1000) cell_s = pd.concat(tp, ignore_index=True) patientsfilepath = 'C:\\Path\To\Patients\CSVFile.csv' tp = pd.io.parsers.read_csv(patientsfilepath, sep=',', iterator=True, chunksize=1000) patient_s = pd.concat(tp, ignore_index=True) |
CSV VIA SQL
作为一个数据库人员,我总是建议处理大型数据加载和合并/加入SQL关系引擎,这种引擎可以很好地扩展到这些进程。 我已经写了很多关于数据帧合并的评论Q / As这个效果 - 即使在R.你可以使用任何SQL数据库,包括文件服务器dbs(Access,SQLite)或客户端服务器dbs(MySQL,MSSQL或其他),甚至在哪里 你的dfs派生了。 Python为SQLite维护一个内置库(否则你使用ODBC); 和数据帧可以使用pandas to_sql作为表推送到数据库中:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import sqlite3 dbfile = 'C:\\Path\To\SQlitedb.sqlite' cxn = sqlite3.connect(dbfile) c = cxn.cursor() cells_s.to_sql(name='cell_s', con = cxn, if_exists='replace') patient_s.to_sql(name='patient_s', con = cxn, if_exists='replace') strSQL = 'SELECT * FROM cell_s c INNER JOIN patient_s p ON c.Description = p.id;' # MIGHT HAVE TO ADJUST ABOVE FOR CELL AND PATIENT PARAMS IN DEFINED FUNCTION merged = pd.read_sql(strSQL, cxn) |
你可能必须分成几块,或者看看火焰。http://blaze.pydata.org