在 Pandas 中合并数据帧块

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)