Сравните два pandas фрейма данных и получите строки левого фрейма данных, значения всех строк которых не находятся в правом фрейме данных. - PullRequest
0 голосов
/ 22 января 2020

У меня есть два кадра данных:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...