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方法更适合合并行/列,但需要额外的过滤和分组累加操作,步骤繁琐且容易出错。
核心逻辑解释
B['foo'].reindex(A.index, fill_value=0):将B的foo列重新对齐到A的索引,对于A有但B没有的索引(比如索引3),填充0;对于B有但A没有的索引(比如索引5),直接丢弃。这样得到的Series和A的索引完全匹配,长度一致。- 用
+=直接把这个对齐后的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
相关产品推荐
相关产品推荐

