Эффективный метод добавления только новых строк из кадра данных pandas в таблицу в базе данных

Предположим, у меня есть таблица X в MySQL следующим образом

A   B
1   2
3   4
5   6

и у меня есть фрейм данных df следующим образом

A   B
1   2
5   6
7   8
9  10

Я хочу добавить в X только новые строки из df (строки, которые есть в df, но не в X). Результаты должны быть:

A   B
1   2
3   4
5   6
7   8
9  10

Обратите внимание, что сортировка не имеет значения для меня. В настоящее время, что я могу сделать, это

1. Read table X and store in a dataframe called dfx
2. Concat df and dfx 
3. Drop duplicate rows
4. Insert the results back to the table X with to_sql(if_exist='replace')

Однако я думаю, что это не очень хорошая практика, особенно когда таблица X очень большая. Могу ли я получить ваши предложения по лучшему пути? Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
689
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если ваши индексы уникальны (или один из столбцов, скажем, A), вы можете

  1. составить список индексов (или уникальный столбец) из фрейма данных,
  2. запросите MySQL со списком и найдите те, которые не существуют в таблице,
  3. подмножить фрейм данных на основе новых индексов или значений столбца и вставить.

Вам нужно будет использовать что-то вроде sqlalchemy для (2). (3) можно легко сделать с помощью DataFrame.query; например df.query("A == @list_of_new_values"), где list_of_new_values — список Python с новыми значениями для столбца A.

Ответ принят как подходящий

Если у вас есть уникальный индекс в вашей таблице, который не позволит вам вставлять повторяющиеся записи (первичный ключ должен сделать эту работу), то будет достаточно использовать INSERT IGNORE вместо INSERT: повторяющиеся записи будут молча отбрасываться, а не генерировать ошибку.

Другие вопросы по теме