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

如何在Python/Pandas中实现两个DataFrame的smear批量值相加?

解决方案

场景1:按分组键(如Category)对应相加

根据你的示例,需求是将小DataFrame中每个分组的Value,加到大DataFrame对应分组的所有Value上。这种场景可以通过合并+广播实现,完全适配大数据量的高效计算:

实现步骤

  • 确保小DataFrame的分组键(如Category)唯一,每个分组仅对应一个Value
  • 将大、小DataFrame按分组键合并,小表的Value会自动广播到对应分组的所有行
  • 对合并后的两列Value求和,得到最终结果

代码示例

import pandas as pd

# 构造示例数据
df_small = pd.DataFrame({
    'Category': [1, 2, 3],
    'Value': [3, 5, 7]
})

df_large = pd.DataFrame({
    'Category': [1,1,1,2,2,2,3,3,3],
    'Value': [6,3,7,2,8,1,4,0,9]
})

# 合并并计算结果
merged_df = df_large.merge(df_small, on='Category', suffixes=('_large', '_small'))
merged_df['Value'] = merged_df['Value_large'] + merged_df['Value_small']
result = merged_df[['Category', 'Value']]

print(result)

输出结果与你的期望完全一致:

Category  Value
0         1      9
1         1      6
2         1     10
3         2      7
4         2     13
5         2      6
6         3     11
7         3      7
8         3     16

场景2:按行顺序分组(小表第i行对应大表第i*8到(i+1)*8行)

如果你的实际需求是不按分组键,而是严格按行顺序匹配:小表第1行Value加到大表前8行,第2行加到接下来8行(4000万行正好是500万行×8,数量完全匹配),可以通过创建分组标识实现:

实现步骤

  • 给大DataFrame添加分组列,每8行标记为一组,分组编号从0到4999999
  • 将小DataFrame的行索引作为分组编号,与大表的分组列合并
  • 对对应分组的Value求和得到结果

代码示例

import pandas as pd

# 构造模拟数据(实际场景替换为你的大数据表)
df_small = pd.DataFrame({'Value': [3,5,7]})  # 模拟500万行的小表
df_large = pd.DataFrame({'Value': [6,3,7,2,8,1,4,0,9]})  # 模拟4000万行的大表(这里用9行=3组×3行演示)

# 给大表添加分组标识:每8行一组(实际场景替换为//8)
df_large['group_id'] = df_large.index // 3

# 小表添加分组标识(用行索引作为分组编号)
df_small['group_id'] = df_small.index

# 合并计算
merged_df = df_large.merge(df_small, on='group_id', suffixes=('_large', '_small'))
merged_df['Value'] = merged_df['Value_large'] + merged_df['Value_small']
result = merged_df[['Value']]  # 不需要group_id可直接删除该列

print(result)

输出:

Value
0      9
1      6
2     10
3      7
4     13
5      6
6     11
7      7
8     16

大数据量性能优化建议

针对500万+4000万的规模,务必注意以下几点:

  • 绝对避免使用apply类循环操作,会导致计算效率骤降
  • 确保合并键(Category或group_id)为整数类型,比字符串类型的合并速度快数倍
  • 如果内存不足,可使用dask.dataframe进行分块计算,避免内存溢出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:23:11