Pet*_*ers 5 python merge dataframe pandas
我目前有一个脚本,可以将多个 csv 文件合并为一个,该脚本工作正常,只是当开始使用较大的文件时,我们会很快用完 ram。这是一个问题,原因之一是脚本在 AWS 服务器上运行,内存不足意味着服务器崩溃。目前,每个文件大小限制约为 250 mb,这将我们限制为 2 个文件,但是由于我工作的公司在生物技术,我们使用的是基因测序文件,我们使用的文件大小范围从 17 mb 到大约 700 mb取决于实验。我的想法是将一个数据帧整体加载到内存中,然后将其他数据帧分块并迭代组合,但效果不佳。
我的数据框与此类似(它们的大小可能不同,但有些列保持不变;“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 |
+-----+-----+-----+-----+-----+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)
当组合两个框架时,我需要它们在“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 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)
我已经有了更改标题名称的代码,所以我不担心这一点,但是当我使用块时,我最终会得到更接近于
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 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 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)
基本上它将每个块视为一个新文件,而不是来自同一个文件。
我知道为什么要这样做,但我不确定如何解决这个问题,现在我的分块代码非常简单。
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"])
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它非常简单,正如我所说,我知道它为什么这样做,但我对 Pandas 和数据框连接都没有经验,无法修复它,因此非常感谢任何帮助。我在搜索堆栈和谷歌时也找不到类似的东西。
小智 3
解决方案是像您一样分块执行,但将输出连接到新的 DataFrame 中,如下所示:
file = "tableFile/123456.txt"
initDF = pd.read_csv(file, sep="\t", header=0)
file2 = "tableFile/7891011.txt"
amgPd = pd.DataFrame()
for chunks in pd.read_csv(file2, sep="\t", chunksize=50000, header=0):
amgPd = pd.concat([amgPd, initDF.merge(chunks, how='right', on=['Mod', "Nuc", "AA"]])
Run Code Online (Sandbox Code Playgroud)