Лучший способ присоединиться к двум крупным наборам данных в 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) на нескольких узлах кластера – это будет намного дешевле, хотя увеличить объем оперативной памяти
  • Как изменить порядок столбцов Pandas?
  • Извлечение информации из нескольких файлов JSON в один файл CSV в python
  • pandas read_csv column dtype устанавливается в десятичное число, но преобразуется в строку
  • Быстрая numpy roll_product
  • Pandas Set DatetimeIndex
  • Эффективно создавать редкие сводные таблицы в пандах?
  • Самый быстрый способ сравнить строку и предыдущую строку в кадре данных pandas с миллионами строк
  • Как взорвать список внутри ячейки Dataframe в отдельные строки
  •  
    Interesting Posts for Van-Lav

    Интерпретация эталона в C, Clojure, Python, Ruby, Scala и других

    Формат / Подавление научной нотации из результатов агрегирования Python Pandas

    Python AES Decryption Routine (Справка по коду)

    Переменные экземпляра объекта внутри класса

    Разделить строку на строки повторяющихся элементов

    Использование Python rdflib: как включить литералы в sparql-запросы?

    Как применить логический оператор ко всем элементам в списке python

    Как установить пакет XGBoost в python в Windows

    выберите на основе временной метки и отметки времени обновления с нулевым значением

    функция распаковки в python

    Как построить гистограмму в интерактивном режиме на основе значения виджета выпадающего списка в bokeh python?

    Список таблиц, db-схемы, дампа и т. Д. С использованием API-интерфейса Python sqlite3

    Как добавить асимметричные ошибочные бары в панельный планшет Pandas?

    Получение списка имен параметров внутри функции python

    Каков самый быстрый способ найти собственные значения / векторы в python?

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