У меня есть два кадра данных:
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']