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

如何在两个Pandas DataFrame间实现匹配条件下的列值求和?

跨DataFrame的条件求和需求

现有两个Pandas DataFrame,需要在second中新增一列result,值为first中与当前行a列匹配的所有行的b列之和,无匹配时填0。

给出的初始代码及数据如下:

import pandas as pd
first = pd.DataFrame([{"a": "aaa", "b": 2, "c": "bla", "d": 1}, {"a": "bbb", "b": 3, "c": "bla", "d": 1}, {"a": "aaa", "b": 4, "c": "bla", "d": 1}, {"a": "ccc", "b": 11, "c": "bla", "d": 1}, {"a": "bbb", "b": 23, "c": "bla", "d": 1}])
second = pd.DataFrame([{"a": "aaa", "val": 111}, {"a": "bbb", "val": 222}, {"a": "ccc", "val": 333}, {"a": "ddd", "val": 444}])

first数据:

a   b    c  d
0  aaa   2  bla  1
1  bbb   3  bla  1
2  aaa   4  bla  1
3  ccc  11  bla  1
4  bbb  23  bla  1

second数据:

a  val
0  aaa  111
1  bbb  222
2  ccc  333
3  ddd  444

预期结果:

a  val result
0  aaa  111      6
1  bbb  222     26
2  ccc  333     11
3  ddd  444      0

解决方案

方法1:分组聚合+合并(高效推荐)

先对first按a分组求和,再和second左合并,最后填充缺失值为0。这种方法性能优于逐行lambda,适合大数据集:

# 对first按a分组,计算b列的和
sum_b = first.groupby('a')['b'].sum().reset_index(name='result')
# 合并到second,无匹配的行用0填充
second = second.merge(sum_b, on='a', how='left').fillna(0)
# 转换为整数类型(可选,根据需求)
second['result'] = second['result'].astype(int)

print(second)

方法2:使用apply+lambda(通用逐行处理)

如果需要用lambda实现通用的逐行查找求和,可以结合first的布尔索引:

second['result'] = second['a'].apply(lambda x: first[first['a'] == x]['b'].sum())

print(second)

这种方法逻辑直观,适合小数据集或需要自定义更复杂条件的场景,但大数据下性能不如分组聚合。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:32:11