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

Pandas处理亿级数据时如何基于列唯一值高效生成目标宽表

数亿条记录的Pandas长表转宽表最高效实现方案

长表转宽表本质是行维度重排操作,要最大化性能需要避免不必要的聚合计算、减少内存拷贝开销,以下是分场景的最优实现方案:

场景1:数据可完整载入单节点内存

如果所有数据能放进当前节点可用内存,优先使用set_index + unstack组合,该方案比pivot、pivot_table性能高30%以上,内存占用低20%左右,仅要求数据不存在重复的(date, id)组合:

import pandas as pd

# 提前将分类列转成category类型,大幅降低内存占用、提升重排速度
df['date'] = df['date'].astype('category')
df['id'] = df['id'].astype('category')

# 核心转换逻辑
wide_df = df.set_index(['date', 'id'])['value'].unstack(level='id').reset_index()

如果存在重复的(date, id)组合需要聚合值,再使用pivot_table指定聚合规则:

# 示例聚合规则为求和,可根据需求替换为max、min、mean等
wide_df = df.pivot_table(
    index='date',
    columns='id',
    values='value',
    aggfunc='sum'
).reset_index()

场景2:数据超出单节点内存

数亿条记录通常会超出普通机器内存,不要强制使用纯Pandas处理,推荐两种方案:

  • 用Dask DataFrame处理:API和Pandas完全兼容,自动分块运算不会爆内存,核心写法和上面完全一致,只需要把Pandas DataFrame替换为Dask DataFrame即可
  • 库内计算优先:如果原始数据存储在数仓、数据库中,直接在存储层用SQL的PIVOT语法完成行转列,计算完成后再导出结果,避免大量原始数据的传输开销

结果校验

转换完成后可以用以下代码校验结果是否符合预期:

# 校验行数列数是否符合预期
print(f"日期数量:{wide_df.shape[0]}, ID数量:{wide_df.shape[1]-1}")
# 校验第一条记录匹配度
print(wide_df.head(1))

内容的提问来源于stack exchange,提问作者Bernardo Trindade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:27:01