У меня есть сценарий, в котором у меня есть existing
фрейм данных, и у меня есть new
фрейм данных, который содержит строки, которые могут быть в фрейме existing
, но также могут иметь новые строки. Я изо всех сил пытался найти надежный способ удалить эти существующие строки из new
кадра данных, сравнивая его с existing
массивом данных.
Я сделал свою домашнюю работу. Решение, похоже, заключается в использовании isin()
. Тем не менее, я считаю, что это скрытые опасности. В частности:
панды получают строки, которые НЕ находятся в другом фрейме данных
Панды не могут вычислить isin с дублирующейся осью
Pandas поддерживает int для float при фильтрации
Есть ли способ надежно отфильтровать строки из одного кадра данных на основе членства / содержания в другом кадре данных? Простой пример использования, который не захватывает угловые случаи, показан ниже. Обратите внимание, что я хочу удалить строки в new
, которые находятся в existing
, чтобы new
содержал только строки, не входящие в existing
. Более простая проблема обновления existing
новыми строками от new
может быть достигнута с помощью pd.merge()
+ DataFrame.drop_duplicates()
In [53]: df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]})
...: df2 = pd.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})
In [54]: df1
Out[54]:
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
In [55]: df2
Out[55]:
col1 col2
0 1 10
1 2 11
2 3 12
In [56]: df1[~df1.isin(df2)]
Out[56]:
col1 col2
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 4.0 13.0
4 5.0 14.0
In [57]: df1[~df1.isin(df2)].dropna()
Out[57]:
col1 col2
3 4.0 13.0
4 5.0 14.0