我有两个数据框:
df1 = pd.DataFrame(data={'a': [random.randint(0, 100) for x in range(1000000)], 'b': [random.randint(0, 100) for x in range(1000000)]})
df2 = pd.DataFrame(data={'a': [random.randint(0, 10) for x in range(2000000)], 'b': [random.randint(0, 10) for x in range(2000000)]})
我想从df1中获取所有行值都不在df2中的所有行。
当前,我这样做:
s1 = df1.drop_duplicates().agg(tuple, axis=1)
s2 = df2.drop_duplicates().agg(tuple, axis=1)
ix = s1[~s1.isin(s2)].index
df1 = df1[df1.index.isin(ix)]
有没有办法使其更快?
编辑:
我已经创建了这样的解决方案,该解决方案是我可以提供的最快的解决方案,但是我失去了订单(索引):
s1 = set([tuple(x) for x in df1.values.tolist()])
s2 = set([tuple(x) for x in df2.values.tolist()])
res = s1 - s2
df1 = pd.DataFrame(data=res, columns=['a', 'b'])
EDIT2:
这似乎是最快,最好的解决方案:
df1 = df1.merge(df2,indicator = True, how='left').loc[lambda x : x['_merge'] =='left_only']