如何在两个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
相关产品推荐
相关产品推荐

