You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:22:43