多列中的相同观察结果

时间:2016-04-18 13:42:33

标签: python pandas

我有一个看起来像这样的数据框

 ID1     ID2    variables
  a      b        something
  b      g        something
  c      h        something
  d      i        something
  a      h        something

如果ID在ID1和ID2中都显示,我希望从数据集中排除ID1中此值的观察结果。 所以在这种情况下

 ID1     ID2    variables
  a      b        something       
  c      h        something
  d      i        something
  a      h        something

我考虑过:

可以对同一ID进行多次观察。重命名,连接和删除重复项将不起作用。

数据集相当大(数百万个观测值),因此每个值的循环都不是一个选项。

3 个答案:

答案 0 :(得分:3)

检查ID1是否具有来自ID2的{​​{3}}值,并使用isin切片来过滤数据。

In [76]: df.loc[~df['ID1'].isin(df['ID2']), :]
Out[76]:
  ID1 ID2  variables
0   a   b  something
2   c   h  something
3   d   i  something
4   a   h  something

详细说明:

In [77]: df
Out[77]:
  ID1 ID2  variables
0   a   b  something
1   b   g  something
2   c   h  something
3   d   i  something
4   a   h  something

In [78]: ~df['ID1'].isin(df['ID2'])
Out[78]:
0     True
1    False
2     True
3     True
4     True
Name: ID1, dtype: bool

In [79]: df.loc[~df['ID1'].isin(df['ID2']), :]
Out[79]:
  ID1 ID2  variables
0   a   b  something
2   c   h  something
3   d   i  something
4   a   h  something

答案 1 :(得分:1)

我认为您可以isin使用Series~ print df.ID1.isin(df.ID2) 0 False 1 True 2 False 3 False 4 False print ~df.ID1.isin(df.ID2) 0 True 1 False 2 True 3 True 4 True Name: ID1, dtype: bool print df[~df.ID1.isin(df.ID2)] ID1 ID2 variables 0 a b something 2 c h something 3 d i something 4 a h something 反转布尔df = pd.concat([df]*100000).reset_index(drop=True) In [157]: %timeit df.loc[~df['ID1'].isin(df['ID2']), :] 10 loops, best of 3: 55.5 ms per loop In [158]: %timeit df[~df.ID1.isin(df.ID2)] 10 loops, best of 3: 55 ms per loop

/><span

<强>测试

><span

答案 2 :(得分:1)

最简单的方法可能

df.query('ID1 not in ID2')