Объединение фрагментов Dataframe в Pandas - PullRequest
3 голосов
/ 18 октября 2019

В настоящее время у меня есть сценарий, который объединит несколько CSV-файлов в один, сценарий работает нормально, за исключением того, что у нас очень быстро заканчивается RAM, когда начинают использоваться файлы большего размера. Это проблема по одной причине: скрипт запускается на сервере AWS, а нехватка ОЗУ означает сбой сервера. В настоящее время ограничение размера файла составляет около 250 МБ каждый, что ограничивает нас двумя файлами, однако, поскольку я работаю в компании Biotech, и мы используем файлы генетического секвенирования, используемые нами файлы могут иметь размер от 17 МБ до 700 МБ. в зависимости от эксперимента. Моя идея состояла в том, чтобы загрузить один фрейм данных в память целиком, а затем разделить на части другие и итеративно объединить, это не сработало.

Мои фреймы данных похожи на это (они могут различаться по размеру, но некоторые столбцыостаются неизменными; «Mod», «AA» и «Nuc»)

+-----+-----+-----+-----+-----+-----+-----+-----+
| Mod | Nuc | AA  | 1_1 | 1_2 | 1_3 | 1_4 | 1_5 |
+-----+-----+-----+-----+-----+-----+-----+-----+
| 000 | ABC | ABC | 10  | 5   | 9   | 16  | 8   |
+-----+-----+-----+-----+-----+-----+-----+-----+
| 010 | CBA | CBA | 0   | 1   | 4   | 9   | 0   |
+-----+-----+-----+-----+-----+-----+-----+-----+

При объединении двух кадров мне нужно, чтобы они объединялись в «Mod», «Nuc» и «AA», так что яесть что-то похожее на это

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Mod | Nuc | AA  | 1_1 | 1_2 | 1_3 | 1_4 | 1_5 | 2_1 | 2_2 | 2_3 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 000 | ABC | ABC | 10  | 5   | 9   | 16  | 8   | 5   | 29  | 0   |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 010 | CBA | CBA | 0   | 1   | 4   | 9   | 0   | 0   | 0   | 1   |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

У меня уже есть код для изменения имен заголовков, так что я не беспокоюсь об этом, однако, когда я использую чанки, я получаю что-то ближе к

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Mod | Nuc | AA  | 1_1 | 1_2 | 1_3 | 1_4 | 1_5 | 2_1 | 2_2 | 2_3 | 3_1 | 3_2 | 3_3 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 000 | ABC | ABC | 10  | 5   | 9   | 16  | 8   | 5   | 29  | 0   | NA  | NA  | NA  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 010 | CBA | CBA | 0   | 1   | 4   | 9   | 0   | NA  | NA  | NA  | 0   | 0   | 1   |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

в основном он обрабатывает каждый кусок как новый файл, а не из одного и того же.

Я знаю, почему он это делает, но я не уверен, как это исправить, сейчас мой код для чанкинга очень прост.

    file = "tableFile/123456.txt"
    initDF = pd.read_csv(file, sep="\t", header=0)
    file2 = "tableFile/7891011.txt"
    for chunks in pd.read_csv(file2, sep="\t", chunksize=50000, header=0):
        initDF = initDF.merge(chunks, how='right', on=['Mod', "Nuc", "AA"])

, как вы можете видеть, он довольно просткости, как я уже сказал, я знаю, почему он делает то, что делает, но у меня нет опыта ни с Pandas, ни с объединениями датафреймов, чтобы иметь возможность это исправить, поэтому любая помощь будет высоко цениться. Я также не мог найти ничего подобного, пока искал в стеке и в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...