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

Pandas:若索引存在则将某列值累加到另一DataFrame对应列

解决方法:对齐索引后累加指定列

首先,我们可以直接针对foo列做索引对齐后的累加操作,完美满足你的需求——既保留A的所有行,只累加B中与A索引匹配的foo值,不会引入B的新行。

代码实现

import pandas as pd

# 构造你的DataFrame A和B
data_A = {'foo': [1,2,3,3], 'bar': [1,2,3,3], 'foo2': [1,2,3,3]}
A = pd.DataFrame(data_A, index=[0,1,2,3])

data_B = {'foo': [1,3,4,5]}
B = pd.DataFrame(data_B, index=[0,2,1,5])

# 核心操作:对齐索引后累加
A['foo'] += B['foo'].reindex(A.index, fill_value=0)

print(A)

输出结果

foo  bar  foo2
0    2    1     1
1    6    2     2
2    6    3     3
3    3    3     3

为什么之前的方法没达到预期?

  • 直接用A.add(B, fill_value=0)会默认取两个DataFrame索引的并集,也就是会把B的索引5也加进来,不符合你"不添加B中无对应索引的行"的要求。
  • concat方法更适合合并行/列,但需要额外的过滤和分组累加操作,步骤繁琐且容易出错。

核心逻辑解释

  1. B['foo'].reindex(A.index, fill_value=0):将B的foo列重新对齐到A的索引,对于A有但B没有的索引(比如索引3),填充0;对于B有但A没有的索引(比如索引5),直接丢弃。这样得到的Series和A的索引完全匹配,长度一致。
  2. 用+=直接把这个对齐后的Series加到A的foo列上,其他列(bar、foo2)不受影响,同时完美保留A的所有原有行。

你也可以用add方法的另一种写法实现同样效果:

A['foo'] = A['foo'].add(B['foo'], fill_value=0).loc[A.index]

这里add后用.loc[A.index]强制保留A的原有索引,过滤掉B带来的新索引,结果和上面完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:10:57