在pandas中放置具有多个键的行

在pandas中放置具有多个键的行,pandas,Pandas,我有两个数据帧,df1和df2 df1: df2: 我想从df1中删除在df2中具有匹配的重叠位置值的行。类似于:df1[df1[['contig','position']]的东西。isin(df2[['contig','position']])] 除非这不起作用。这里有一个详细的方法: iter1 = df1[['contig', 'position']].itertuples() is_in_other_df = [] for row in iter1: tup2 = df2.ite

我有两个数据帧,
df1
df2

df1:

df2:

我想从df1中删除在df2中具有匹配的重叠位置值的行。类似于:
df1[df1[['contig','position']]的东西。isin(df2[['contig','position']])]

除非这不起作用。

这里有一个详细的方法:

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]

Version.13在DataFrame中添加了一个
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
要获取未包含的元素,请使用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

您可以对该系列执行两次(适用于0.12):

也许我们可以在0.13中得到一个简洁的解决方案(使用DataFrame的
isin
,就像Tom的答案一样)

感觉应该有一个整洁的方法来使用内部


Andy如果你读到这篇文章,你对接受另一个数据帧(必须进行类似的索引)以消除df2.to_dict的需要有什么想法?使用to_dict并不可怕,但看起来@user1867185希望数据帧能够正常工作。DF是dict,所以应该不难做到。我们没有将它放在0.12中,以防API发生更改,看起来可能有:)您介意为此编写github问题吗?令人兴奋的是,我在做类似的事情时遇到了一个错误…谢谢你的帮助。很明显,我使用的是0.12.0,我在几分钟前用“pip install pandas”安装了它。我只尝试了您提出的第一个解决方案,结果是“AttributeError:“DataFrame”对象没有属性“isin”。@AndyHayden我将开始一个问题@user1867185
isin
方法是.13的新方法,尚未正式发布。我认为pip能够从github存储库进行安装。熊猫'位于感觉应该是一个整洁的合并方式感觉应该有更整洁的方式做反连接!
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
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
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