Мне нужно предварительно обработать множество таблиц csv , чтобы применить их к автоэнкодеру.
Используя pandas, я читаю все эти таблицы как кадры данных. Затем мне нужно объединить их на основе общего ключа (id). merged = pd.merge(df, df1, on='id', how = 'left')
.
Однако после пары слияний размер получившейся таблицы стал очень большим и убил ядро. Это последний размер, который я получил за результат объединения до того, как ядро умерло merged.shape = (29180782, 71)
. И мне нужно объединить еще много таблиц.
Все таблицы имеют внешний вид, подобный этому, но с большим количеством строк и столбцов (значения, определенные в каждом столбце, показывают категорию):
df: df1:
id a b c d id e f g h
0 2000 1 1 1 3 2000 1 1 1 1
1 2001 2 1 1 3 2001 2 0 0 3
2 2002 1 3 1 2 2002 1 3 1 2
3 2003 2 2 1 1 2003 1 0 1 1
Я пробовал Перо , но это не помогает. Я также попытался уменьшить количество столбцов df['a'] = pd.to_numeric(df['a'], downcast='unsigned')
, но не увидел различий в размере таблицы. Последнее решение пришло мне в голову - использовать чанк. Я попробовал приведенный ниже код с разными размерами чанка, но ядро снова умерло:
for chunk in pd.read_csv('df1', chunksize = 100000, low_memory=False):
df = pd.merge(df,chunk , on='id', how = 'left')
Поэтому я решил записать файл вместо использования переменной, чтобы ядро не погибло. Сначала я сохранил последнюю объединенную таблицу в csv-файле, чтобы читать ее по частям для следующего процесса объединения.
lastmerged.to_csv(r'/Desktop/lastmerged.csv', index=False)
А затем:
from csv import writer
for chunk in pd.read_csv('lastmerged.csv', chunksize = 100000, low_memory=False):
newmerge = pd.merge(df1,chunk , on='id', how = 'right')
with open('newmerge.csv', 'a+', newline='') as write_obj:
csv_writer = writer(write_obj)
for i in range (len(newmerge)):
csv_writer.writerow(newmerge.loc[i,:])
Я сделал попробуйте этот фрагмент кода на некоторых небольших таблицах, и я получил желаемый результат. Но для моих реальных таблиц потребовалось много времени для запуска, и это заставило меня остановить ядро: | Кроме того, код не кажется эффективным!
В ореховой оболочке мой вопрос состоит в том, как объединять таблицы, когда они становятся все больше и больше и вызывают гибель ядра и проблемы с памятью. пс. Я уже пробовал гугл колаб, юпитер и терминал. Они все работают одинаково.