我有一个包含许多大型 CSV 文件的数据集(总体积为 30GB)。每个文件都提供有关人员的特定类型信息。但所有文件都有一个名为“ID”的列,它描述了给定信息的相关人员。如何按“ID”列合并所有 CSV 文件,以便在完全合并的文件中我将获得有关每个 ID 的完整信息?
我有 16GB RAM 和 64GB 交换内存,但即使这样也不足以将文件与 pandas 或 Polars 合并。
我没有处理如此大量数据的经验,但您可能可以尝试以下操作:将每个文件分成一些
k
相等的部分(例如,您可以尝试 k=10
)。然后,按 ID 合并所有文件的第一部分,然后合并文件的所有第二部分,依此类推。
例如,如果您有 3 个文件
a, b, c
,那么划分每个文件后您将得到文件列表
[a_0, ..., a_{k-1}]
[b_0, ..., b_{k-1}]
[c_0, ..., c_{k-1}]
然后,在合并每个
a_i, b_i, c_i
的 i
后,您最终会得到 k
文件,每个文件的大小为 30/k=3GB,并且您的 RAM 中应该有足够的空间来容纳这个数量。
仅确保划分文件,以便文件的第
i
部分 (a_i, b_i, c_i
) 包含具有相同 ID 的记录。为此,您可以在分割文件之前简单地按 ID 对每个文件进行排序。
您可以使用 pandas 来实现这一点。假设您的查询具有以下结构。
文件文件夹 --> file1.csv、file2.csv
主文件 --> main.csv
以下是上述 CSV 的内容:
main.csv
id, name, age, gender
1, Abc, 20, Male
2, Pqr, 20, Female
3, Mnq, 27, Male
file1.csv
id, Designation, Experience
1, Jr. Developer, 8 months
2, Senior Developer, 8 Years
3, HR, 5 months
file2.csv
id, Area/Field
1, Python
2, Java
3, Sales & Marketing
片段:
import pandas as pd
import os
main_file = pd.read_csv("main.csv")
for file in os.listdir("your-folder-path"):
file_df = pd.read_csv(f"./input/{file}")
main_file = pd.merge(main_file, file_df, on='id', how="left")
main_file.to_csv("combined.csv", index=False)
OUTPUT:
id, name, age, gender, Designation, Experience, Area/Field
1, Abc,20, Male, Jr. Developer, 8 months, Python
2, Pqr,20, Female, Senior Developer, 8 Years, Java
3, Mnq,27, Male, HR, 5 months, Sales & Marketing