Лучший способ присоединиться к двум крупным наборам данных в Pandas

Я загружаю два набора данных из двух разных баз данных, которые необходимо объединить. Каждый из них по отдельности составляет около 500 МБ, когда я храню их как CSV. Отдельно вписывается в память, но при загрузке я иногда получаю ошибку памяти. У меня определенно возникают проблемы, когда я пытаюсь объединить их с пандами.

Каков наилучший способ сделать внешнее соединение на них, чтобы я не получил ошибку памяти? У меня нет серверов баз данных, но я могу установить на моем компьютере любое ПО с открытым исходным кодом, если это поможет. В идеале я все равно хотел бы разрешить его только в пандах, но не уверен, что это вообще возможно.

Прояснить: слиянием я подразумеваю внешнее соединение. Каждая таблица имеет две строки: продукт и версию. Я хочу проверить, какие продукты и версии находятся только в левой таблице, только для правой таблицы и обеих таблиц. Что я делаю с

pd.merge(df1,df2,left_on=['product','version'],right_on=['product','version'], how='outer') 

2 Solutions collect form web for “Лучший способ присоединиться к двум крупным наборам данных в Pandas”

Это похоже на задачу, для dask был создан dask . По сути, dask может выполнять операции pandas из-за ядра, поэтому вы можете работать с наборами данных, которые не вписываются в память. API dask.dataframe является подмножеством API pandas , поэтому кривая обучения не должна быть значительной. См. Страницу Обзор Dask DataFrame для некоторых дополнительных подробных данных DataFrame.

 import dask.dataframe as dd # Read in the csv files. df1 = dd.read_csv('file1.csv') df2 = dd.read_csv('file2.csv') # Merge the csv files. df = dd.merge(df1, df2, how='outer', on=['product','version']) # Write the output. df.to_csv('file3.csv', index=False) 

Предполагая, что 'product' и 'version' являются единственными столбцами, может быть более эффективным заменить merge :

 df = dd.concat([df1, df2]).drop_duplicates() 

Я не совсем уверен, что это будет лучше, но, по-видимому, слияния, которые не выполняются в индексе, являются «медленными» в dask , поэтому стоит попробовать.

Я бы рекомендовал вам использовать RDBMS, такие как MySQL для этого …

Поэтому сначала вам нужно будет загружать файлы CSV в таблицы .

После этого вы можете выполнить свои проверки:

какие продукты и версии находятся только в левой таблице

 SELECT a.product, a.version FROM table_a a LEFT JOIN table_b b ON a.product = b.product AND a.version = b.version WHERE b.product IS NULL; 

какие продукты и версии находятся только в правой таблице

 SELECT b.product, b.version FROM table_a a RIGHT JOIN table_b b ON a.product = b.product AND a.version = b.version WHERE a.product IS NULL; 

в обоих

 SELECT a.product, a.version FROM table_a a JOIN table_b b ON a.product = b.product AND a.version = b.version; 

Настройте свой MySQL-сервер , чтобы он использовал как минимум 2 ГБ ОЗУ

Вы также можете использовать механизм MyISAM для своих таблиц, в этом случае проверьте это

Это может работать медленнее по сравнению с Pandas, но у вас определенно не будет проблем с памятью.

Другие возможные решения:

  • увеличить объем оперативной памяти
  • используйте Apache Spark SQL (распределенный DataFrame) на нескольких узлах кластера – это будет намного дешевле, хотя увеличить объем оперативной памяти
  • для цикла слишком долго для создания / экспорта вывода в Python
  • Pandas - проверьте, если строковый столбец в одном фрейме содержит пару строк из другого фрейма данных
  • Укажите правильные типы данных, используя pandas.read_csv
  • Pandas скомпилирован из источника: поведение по умолчанию по умолчанию изменено
  • Выбор уникальных наблюдений в кадре данных панд
  • Как решить следующее условие?
  • Pandas plot - изменить основные и второстепенные символы для дат
  • Почему печать фрейма данных прерывает python при построении из numpy empty_like
  • Легкий способ применить преобразование из `pandas.get_dummies` к новым данным?
  • Python - добавление полей и меток в вложенный файл json
  • Как уменьшить размер кадра данных pandas
  •  
    Interesting Posts for Van-Lav

    обновить артист (Line2D) на фигуре без повторного рисования всей фигуры – сбрасывается axes.draw_artist ()

    Установите pyUSB 0.4.3 на OSX Lion 10.7.3

    Pandon pandas: как запустить множественную одномерную регрессию по группам

    Не удалось загрузить DLL-модуль python в PyCharm. Работает отлично в IPython

    python: чтение строк из сжатых текстовых файлов

    Как я могу заставить эту рекурсивную функцию Python возвращать плоский список?

    Ускорить двойную петлю в Python

    Ошибка SSL для запроса PETON GET

    Как удалить нечисловой столбец из входного набора данных?

    Как я должен структурировать и получать доступ к таблице данных, чтобы я мог легко сравнивать подмножества в Python 3.5?

    Сериализация PySpark EOFError

    Одно слово Palindrome Checker (True или False)

    Как я могу обойти ошибку модуля kivy: ImportError: Ошибка загрузки DLL: указанного модуля не удалось найти?

    AssertRaises не подлежит вызову

    python ленивые переменные? или, отложенные дорогостоящие вычисления

    Python - лучший язык программирования в мире.