簡體   English   中英

Pandas DataFrame.merge MemoryError

[英]Pandas DataFrame.merge MemoryError

目標

我的目標是通過它們的共同列(基因名稱)合並兩個DataFrame,這樣我就可以在每個基因行中獲取每個基因得分的乘積。 然后,我會對患者和細胞進行groupby ,並對每個分數進行總結。 最終數據框應如下所示:

    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

最后一部分應該可以正常工作,但由於MemoryError ,我無法對基因名稱進行第一次合並。 以下是每個DataFrame的代碼段。

數據

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約為10,000,000行

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約為1,200,000行

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

最初read_csv這些文件時我得到一個MemoryError,但是然后指定dtypes解決了這個問題。 確認我的python是64位也沒有解決我的問題。 我沒有達到熊貓的限制,是嗎?

Python 3.4.3 | Anaconda 2.3.0(64位)| 熊貓0.16.2

考慮兩個解決方法:

CSV By CHUNKS

顯然, read_csv可能會遇到性能問題,因此大文件必須以迭代的塊加載。

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作為表推送到數據庫中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM