我有一个看起来像这样的数据框
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进行多次观察。重命名,连接和删除重复项将不起作用。
数据集相当大(数百万个观测值),因此每个值的循环都不是一个选项。
答案 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')