一种复杂的方法是使用多个嵌套调用isin:
In [39]:
df=pd.DataFrame({'a':['A','B','V','D']})
df1=pd.DataFrame({'a':['D','C','B']})
df2=pd.DataFrame({'a':['A','B']})
df[df.a.isin(df1[df1.a.isin(df2.a)].a)]
Out[39]:
a
1 B
另一种方法是调用np.intersect1d,这假定值是唯一的:
In [46]:
np.intersect1d(df2.a.unique(), np.intersect1d(df.a.unique(), df1.a.unique()))
Out[46]:
array(['B'], dtype=object)
我们可以再次执行 2 个内部 merges 这将合并所有 dfs 中存在的值:
In [47]:
df.merge(df1, on='a').merge(df2, on='a')
Out[47]:
a
0 B
时间
In [48]:
%timeit df[df.a.isin(df1[df1.a.isin(df2.a)].a)]
1000 loops, best of 3: 1.51 ms per loop
In [49]:
%timeit np.intersect1d(df2.a.unique(), np.intersect1d(df.a.unique(), df1.a.unique()))
1000 loops, best of 3: 360 µs per loop
In [50]:
%timeit df.merge(df1, on='a').merge(df2, on='a')
100 loops, best of 3: 4.76 ms per loop
numpy 方法在这个数据集上很容易获胜