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

基于CNPJ与年份分组的faturamento和potFaturamento列求和

高效分组求和解决方案(适用于超大数据量)

针对1亿行的DataFrame,绝对不能用iterrows()这类逐行循环的方法——这类方法是纯Python层面的循环,速度极慢,完全扛不住大数据量。推荐用pandas内置的矢量化分组聚合操作,底层由C实现,性能能提升几个数量级。

具体步骤代码

import pandas as pd

# 你的示例数据
df = pd.DataFrame(columns=["CNPJ", "faturamento", "potFaturamento", "yearMonth"])
df["CNPJ"] = ["01","01","01","02","02","02"]
df["faturamento"] = [100,300,150,200,150,100]
df["potFaturamento"] = [50,100,200,100,50,100]
df["yearMonth"] = ["202105","202406","202407","202206","202107","202207"]

# 1. 从yearMonth提取年份(矢量化操作,速度极快)
df["year"] = df["yearMonth"].str[:4]

# 2. 按CNPJ和year分组,对目标列求和
result = df.groupby(["CNPJ", "year"], as_index=False).agg(
    sumFaturamento=("faturamento", "sum"),
    sumPotFaturamento=("potFaturamento", "sum")
)

# 查看结果
print(result)

代码说明

  • 提取年份:用str[:4]直接截取yearMonth字符串的前4位,这是pandas的矢量化字符串操作,不需要循环,处理1亿行也能快速完成。
  • 分组聚合:groupby是pandas专门为分组统计设计的高效工具,配合agg指定要聚合的列和对应的函数(这里是求和),全程在底层C代码执行,性能远超Python循环。
  • as_index=False:让分组的CNPJ和year保持为普通列,不需要额外重置索引,一步到位得到和你期望格式一致的结果。

运行结果

CNPJ  year  sumFaturamento  sumPotFaturamento
0   01  2021             100                 50
1   01  2024             450                300
2   02  2021             150                 50
3   02  2022             300                200

额外性能优化建议(针对1亿行数据)

  • 如果内存紧张,可以考虑用dtype提前指定列的数据类型,比如把CNPJ设为category类型(如果重复值很多),把数值列设为int32(只要数值范围允许),能大幅减少内存占用。
  • 若pandas单进程还是慢,可以尝试用dask.dataframe做并行处理,它的API和pandas几乎一致,能利用多CPU核心处理超大数据。

内容的提问来源于stack exchange,提问作者Jean Carlo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:18:23