2017-05-11 36 views
0

我有相互作用由染色體(CHR)表示染色體對一個數據幀,和位置(POS),如下所示:子集數據幀具有不同長度的另一個數據幀

>>>import pandas as pd 

>>>df1 
chr1  pos1  chr2  pos2 
chr1 54278 chr13 68798 
chr1 32145  chr7 1248798 
... 
[162689366 rows x 4 columns] 

在真實數據組,這些被分選通過chr1,然後pos1,chr2,pos2。

我與相互作用對我不妨先看看下面的格式的另一個數據集:

>>>df2 
chr  start  stop  comment 
chr1 54275 55080 cluster-1 
chr1 515523 515634 cluster-2 
... 
chr13 68760 70760 
... 
[69 rows x 4 columns] 

我想子集DF1,包括行,當且僅當兩者的相互作用對(CHR 1 POS1 & CHR2 -pos2)在df2的開始和停止值範圍內。

在這個例子中,最終的數據幀將是這個樣子:

>>>df3 
chr1 pos1  chr2  pos2 
chr1 54278 chr13 68798 
... 

我一直在努力明智做到這一步(第一個CHR-POS對,那麼第二個)使用.between功能在熊貓沒有任何成功。我已經嘗試了python2.7和python3.6。

>>>df3 = df1[(df1['chr1'].isin(df2.chr)) & df1['pos1'].between(df1.pos1(df2.start),df1.pos1(df2.stop))] 

這似乎適用於.isin但我得到..The函數的錯誤。我認爲,因爲數據幀長度不一樣,但我無法確定。

>>>df1['pos1'].between(df2.start,df2.stop) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/pandas/core/series.py", line 2412, in between 
    lmask = self >= left 
    File "/usr/lib/python2.7/dist-packages/pandas/core/ops.py", line 699, in wrapper 
    raise ValueError('Series lengths must match to compare') 
ValueError: Series lengths must match to compare 

任何幫助,非常感謝!

回答

0

有人可能會有一個更優雅的解決方案,但在我的腦海中,我會加入df2df1兩次,以便您將所有內容都放在一個數據集中,並且比較很容易。

df2基本上是查找表,並且df2.chr應分別與df1.chr1df1.chr2匹配。

df_all = df1.merge(df2, 
        how='inner', 
        left_on='chr1', 
        right_on='chr') \ 
      .merge(df2, 
        how='inner', 
        left_on='chr2', 
        right_on='chr', 
        suffixes=('_r1', '_r2')) 

請注意後綴。所以pos1將被測試在start_r1-stop_r1範圍內,並且pos2將被測試爲在start_r2-stop_r2範圍內。

df3 = df_all[(df_all['pos1'] \ 
        .between(df_all['start_r1'], df_all['stop_r1'])) & 
      (df_all['pos2'] \ 
        .between(df_all['start_r2'], df_all['stop_r2']))] 

# Back to four original columns again 
df3 = df3[['chr1', 'pos1', 'chr2', 'pos2']]