Dask dataframe не имеет атрибута _meta_nonempty при объединении больших CSV в Python

Я пробовал панд с:

import pandas as pd
df1 = pd.read_csv("csv1.csv")
df2 = pd.read_csv("csv2.csv")
my_keys = ["my_id", "my_subid"]
joined_df = pd.merge(df1, df1, on=my_keys)
joined_df.to_csv('out_df.csv', index=False)

И получил ошибку памяти после некоторого измельчения.

Далее я попробовал Dask:

import dask.dataframe as dd

ddf1 = dd.read_csv("csv1.csv")
ddf2 = dd.read_csv("csv2.csv")
my_keys = ["my_id", "my_subid"]
joined_ddf = dd.merge(ddf1, ddf2, on=[my_keys])
joined_ddf.to_csv('out_ddf.csv', index=False)

И я получил довольно загадочный

'DataFrame' object has no attribute '_meta_nonempty'

Что может упомянуть документ (я думаю, из-за дорогостоящего вывода типа или чего-то такого, что происходит в Пандах). Но после того, как возиться с ручной настройкой метаданных, используя типы из панд, пытаюсь from_pandas() и я никуда не денусь, я думаю, что Даск - не тот путь.

Что дальше? Если нет хитрости с метаданными, лучше всего использовать sqlalchemy а также df.to_sql разгрузить объединение во внешнюю БД? Я держался подальше от равнины csv Модуль из-за нескольких индексов в соединении.

1 ответ

Решение

Продолжение: сброс в Postgres был довольно безболезненным, хотя кадры с данными все еще кажутся мне чище.

import pandas as pd
from sqlalchemy import create_engine

df1 = pd.read_csv("csv1.csv")
df2 = pd.read_csv("csv2.csv")

engine = create_engine('postgresql://user:passwd@localhost:5432/mydb')
df1.to_sql('tableOne', engine)
df2.to_sql('tableTwo', engine)

query = """
  SELECT *
  FROM tableOne AS one
  INNER JOIN tableTwo AS two
  ON one.subject_id=two.subject_id
  AND one.subject_sub_id=two.subject_sub_id
  ORDER BY
  one.subject_id,
  one.subject_id
  """
df_result = pd.read_sql_query(query, engine)
df_result.to_sql('resultTable', engine)
df_result.to_csv("join_result.csv")

Придется снова попробовать Даск в будущем.

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