2013-07-31 70 views
4

我有兩個數據幀,df1df2在熊貓中丟棄具有多個鍵的行

DF1:

contig position tumor_f t_ref_count t_alt_count 
1  14599 0.000000   1   0 
1  14653 0.400000   3   2 
1  14907 0.333333   6   3 
1  14930 0.363636   7   4 

DF2:

contig position 
1  14599 
1  14653 

我想從DF1具有匹配重疊羣,在DF2位置值刪除的行。類似於:df1[df1[['contig','position']].isin(df2[['contig','position']])] 除此之外不起作用。

回答

1

這裏有一個詳細的方法:

iter1 = df1[['contig', 'position']].itertuples() 
is_in_other_df = [] 
for row in iter1: 
    tup2 = df2.itertuples() 
    is_in_other_df.append(row in tup2) 
df1["InOtherDF"] = is_in_other_df 

然後剛落行,其中 「InOtherDF」 是True。在回送行元組時,您可能需要略微調整它以忽略索引。

我覺得這是一個使用merge

df2["FromDF2"] = True 
df1 = pandas.merge(df1, df2, left_on=["contig", "position"], 
        right_on=["contig", "position"], how="left") 
df1[~df1.FromDF2] 
+0

感覺好像有應該是做反連接更合適的方法! –

3

版本0.13中添加isin方法數據幀,將做到這一點更清潔的方式。如果你正在使用的當前主可以嘗試:

In [46]: df1[['contig', 'position']].isin(df2.to_dict(outtype='list')) 
Out[46]: 
    contig position 
0 True  True 
1 True  True 
2 True False 
3 True False 

要獲得不包含使用~元素不和指數

In [45]: df1.ix[~df1[['contig', 'position']].isin(df2.to_dict(outtype='list')). 
all(axis=1)] 
Out[45]: 
    contig position tumor_f t_ref_count t_alt_count 
2  1  14907 0.333333   6   3 
3  1  14930 0.363636   7   4 
+0

Andy如果您閱讀了這篇文章,您對'isin'接受另一個數據幀(必須進行類似索引)的想法是否可以消除對df2.to_dict的需求?使用to_dict並不可怕,但它看起來像@ user1867185期待數據框的工作。 – TomAugspurger

+0

一個DF是字典,所以不應該很難做 – Jeff

+0

我們沒有把它放在0.12的情況下,有API的變化,看起來像可以有:)你介意放在一起的github問題呢?令人興奮的是,我在做類似的事情時遇到段錯誤... –

3

您可以用系列isin做兩次(在工作0.12):

In [21]: df1['contig'].isin(df2['contig']) & df1['position'].isin(df2['position']) 
Out[21]: 
0  True 
1  True 
2 False 
3 False 
dtype: bool 

In [22]: ~(df1['contig'].isin(df2['contig']) & df1['position'].isin(df2['position'])) 
Out[22]: 
0 False 
1 False 
2  True 
3  True 
dtype: bool 

In [23]: df1[~(df1['contig'].isin(df2['contig']) & df1['position'].isin(df2['position']))] 
Out[23]: 
    contig position tumor_f t_ref_count t_alt_count 
2  1  14907 0.333333   6   3 
3  1  14930 0.363636   7   4 

或許我們可以用數據幀的isin像湯姆的答案0.13(得到一個巧妙的解決辦法)。

它覺得,就必須有一個整潔的方式做到這一點的採用內部merge ...

In [31]: pd.merge(df1, df2, how="inner") 
Out[31]: 
    contig position tumor_f t_ref_count t_alt_count 
0  1  14599  0.0   1   0 
1  1  14653  0.4   3   2 
+0

感覺應該是一個整潔的合併方式 –