Python中突破Pandas限制:千万级大型数据集高效合并方案
处理超大型数据集合并的高效Python方案
针对1000万+行的数据集合并需求,以下是几种比Pandas更高效的实现方案,均支持自定义列操作:
1. Dask DataFrame(并行分块处理)
Dask通过将数据集拆分为多个小分块并行处理,避免一次性加载全量数据到内存,适合内存有限的场景,代码风格贴近Pandas,学习成本低。
import dask.dataframe as dd # 读取数据集(替换为你的实际数据源路径,支持csv/parquet等格式) df1 = dd.read_csv("df1_large.csv") df2 = dd.read_csv("df2_large.csv") # 按ID执行外连接(可根据需求改为inner/left/right) merged = dd.merge(df1, df2, on="ID", how="outer", suffixes=("_1", "_2")) # 自定义操作:计算Amount列的乘积,空值填充为0 merged["Amount_Product"] = merged["Amount_1"].fillna(0) * merged["Amount_2"].fillna(0) # 执行计算并保存结果(若结果能放入内存,可通过.compute()转为Pandas DataFrame) merged.to_parquet("merged_result.parquet", write_index=False)
2. PyArrow + DuckDB(列式存储+嵌入式OLAP)
PyArrow提供高效的列式存储支持,DuckDB作为轻量嵌入式OLAP数据库,能以类SQL的方式快速处理超大型数据集,单机性能远超Pandas的合并操作。
import pyarrow.csv as pv import duckdb # 用PyArrow高效读取大文件 table1 = pv.read_csv("df1_large.csv") table2 = pv.read_csv("df2_large.csv") # 注册表到DuckDB并执行合并计算 con = duckdb.connect() con.register("table1", table1) con.register("table2", table2) # 通过SQL完成合并和自定义列操作 result = con.execute(""" SELECT COALESCE(t1.ID, t2.ID) AS ID, t1.Value1, t2.Value2, COALESCE(t1.Amount, 0) * COALESCE(t2.Amount, 0) AS Amount_Product FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.ID = t2.ID """).fetch_arrow_table() # 保存结果为Parquet格式(高效压缩,适合大数据存储) result.write_parquet("merged_result.parquet")
3. SQLAlchemy + 本地数据库(SQLite/PostgreSQL)
将数据导入数据库后,利用数据库的查询优化器处理大数据合并,适合需要重复查询或复杂业务逻辑的场景,PostgreSQL还支持并行查询进一步提升性能。
SQLite示例(无需额外安装服务):
from sqlalchemy import create_engine, text import pandas as pd # 创建SQLite本地数据库引擎 engine = create_engine("sqlite:///large_data.db") # 分批导入数据,避免内存溢出 chunk_size = 100000 for chunk in pd.read_csv("df1_large.csv", chunksize=chunk_size): chunk.to_sql("df1", engine, if_exists="append", index=False) for chunk in pd.read_csv("df2_large.csv", chunksize=chunk_size): chunk.to_sql("df2", engine, if_exists="append", index=False) # 执行合并与自定义计算,分批读取结果保存 with engine.connect() as conn: result = conn.execute(text(""" SELECT COALESCE(t1.ID, t2.ID) AS ID, t1.Value1, t2.Value2, COALESCE(t1.Amount, 0) * COALESCE(t2.Amount, 0) AS Amount_Product FROM df1 t1 FULL OUTER JOIN df2 t2 ON t1.ID = t2.ID """)) for chunk in result.chunks(chunk_size): pd.DataFrame(chunk).to_csv("merged_result.csv", mode="a", header=False, index=False)
方案选型参考:
- Dask:适合内存有限的单机/分布式场景,代码风格贴近Pandas;
- DuckDB+PyArrow:单机场景下性能最优,SQL语法灵活易上手;
- 数据库方案:适合长期数据存储或复杂查询逻辑的场景,可复用性强。
内容的提问来源于stack exchange,提问作者Alef Rodrigo Pereira
相关产品推荐
相关产品推荐

