4

私は2つのデータフレームを持っていdf1ますdf2.

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

一致するコンティグ、df2 の位置の値を使用して、df1 から行を削除したいと思います。似たようなもの:df1[df1[['contig','position']].isin(df2[['contig','position']])] これが機能しないことを除いて。

4

3 に答える 3

3

バージョン .13 では、isinこれを実現するメソッドが DataFrame に追加されています。現在のマスターを使用している場合は、次を試すことができます。

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

含まれていない要素を取得するには~、not と index を使用します

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
于 2013-07-31T19:50:28.463 に答える
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]
于 2013-07-31T19:42:31.940 に答える