Наразі вибране рішення дає невірні результати. Щоб правильно вирішити цю проблему, ми можемо виконати ліве з'єднання від df1до df2, переконавшись, що спочатку отримаємо лише унікальні рядки df2.
Спочатку нам потрібно змінити оригінальний DataFrame, щоб додати рядок з даними [3, 10].
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3],
'col2' : [10, 11, 12, 13, 14, 10]})
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
'col2' : [10, 11, 12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
5 3 10
df2
col1 col2
0 1 10
1 2 11
2 3 12
Виконайте з’єднання ліворуч, усуваючи дублікати df2так, щоб кожен ряд поєднувався df1з рівно 1 рядком df2. Використовуйте параметр, indicatorщоб повернути додатковий стовпець із зазначенням, з якої таблиці був рядок.
df_all = df1.merge(df2.drop_duplicates(), on=['col1','col2'],
how='left', indicator=True)
df_all
col1 col2 _merge
0 1 10 both
1 2 11 both
2 3 12 both
3 4 13 left_only
4 5 14 left_only
5 3 10 left_only
Створіть булеву умову:
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
Чому інші рішення неправильні
Кілька рішень роблять ту саму помилку - вони лише перевіряють, що кожне значення знаходиться незалежно у кожному стовпчику, а не разом у одному рядку. Додаючи останній рядок, який є унікальним, але має значення обох стовпців з df2викриває помилку:
common = df1.merge(df2,on=['col1','col2'])
(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))
0 False
1 False
2 False
3 True
4 True
5 False
dtype: bool
Це рішення отримує той самий неправильний результат:
df1.isin(df2.to_dict('l')).all(1)