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

基于另一Pandas DataFrame列求和新增列的高效实现方案

高效实现DataFrame按分组求和合并的方案

针对百万级数据集的场景,避免逐行循环,改用pandas的矢量化聚合+合并操作,是效率最优的解决方案。核心思路是先对第二个DataFrame按unit分组求和,再将结果合并到第一个DataFrame中。

代码实现步骤

1. 构造示例数据(对应你的输入结构)

import pandas as pd

df1 = pd.DataFrame({
    'unit': [1, 2, 3],
    'year': [2020, 2021, 2022]
})

df2 = pd.DataFrame({
    'unit': [1, 2, 2, 2, 2, 3],
    'observations': [0, 1, 2, 3, 4, 5]
})

2. 对第二个DataFrame按unit聚合求和

先计算每个unit对应的observations总和,生成一个映射表:

# 分组求和并重置索引,得到unit与总和的对应关系
sum_observations = df2.groupby('unit')['observations'].sum().reset_index()

此时sum_observations的结构为:

unit  observations
0     1              0
1     2             10
2     3              5

3. 将求和结果合并到第一个DataFrame

用merge操作完成匹配,确保保留df1的所有行:

# 按unit字段左合并,保留df1原有结构
result_df = df1.merge(sum_observations, on='unit', how='left')

最终得到的result_df就是你需要的目标结构:

unit  year  observations
0     1  2020              0
1     2  2021             10
2     3  2022              5

效率说明

  • groupby和merge都是pandas底层优化的矢量化操作,基于C语言扩展实现,避免了Python层面的逐行循环,处理400万行数据的速度会比iterrows方案快几个数量级。
  • 如果df1中存在df2没有的unit值,how='left'会保留这些行,对应的observations会显示为NaN,可以用result_df.fillna(0, inplace=True)统一填充为0。

内容的提问来源于stack exchange,提问作者Carlos Eduardo Barros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:13:18