基于另一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
相关产品推荐
相关产品推荐

