如何在Pandas中对DataFrame求和并保留缺失列的原始值?
解决多DataFrame求和时保留缺失列原始值的问题
问题场景
需要对多个DataFrame执行求和操作,但部分DataFrame存在独有的缺失列。当前直接用dfa + dfb得到的结果中,这些独有的列会被填充为NaN,需求是保留这些列的原始值(比如dfa的B列、dfb的C列),且方案要适配大数据量的自动化处理。
示例代码
#!/usr/bin/env ipython import pandas as pd import numpy as np N=10 years = [vv for vv in range(2010,2010+N)] # 生成测试数据 data_a = {'years':years,'A':np.random.random(N),'B':np.random.random(N)} data_b = {'years':years,'A':np.random.random(N),'C':np.random.random(N)} dfa = pd.DataFrame.from_dict(data_a).set_index('years') dfb = pd.DataFrame.from_dict(data_b).set_index('years') # 当前求和结果(含NaN) dfc = dfa + dfb
当前求和结果
A B C years 2010 0.830207 NaN NaN 2011 1.237387 NaN NaN 2012 1.386908 NaN NaN 2013 0.949136 NaN NaN 2014 0.897436 NaN NaN 2015 0.375644 NaN NaN 2016 1.134836 NaN NaN 2017 1.125501 NaN NaN 2018 1.140183 NaN NaN 2019 0.522178 NaN NaN
解决方案
方法1:用combine_first自动补全(推荐)
先执行求和,再用原始DataFrame的非NaN值替换结果中的NaN,适配任意数量的DataFrame:
# 两DataFrame场景 dfc = dfa + dfb dfc = dfc.combine_first(dfa).combine_first(dfb) # 多DataFrame场景(可扩展为更多DataFrame的列表) dfs = [dfa, dfb] df_sum = sum(dfs) for df in dfs: df_sum = df_sum.combine_first(df)
combine_first会优先保留当前DataFrame的值,仅用传入的DataFrame填充NaN,完美匹配“共同列求和、独有列保留原值”的需求。
方法2:用fillna手动指定列(适合列数少的场景)
如果明确知道独有的列名,也可以直接填充:
dfc = dfa + dfb dfc['B'] = dfc['B'].fillna(dfa['B']) dfc['C'] = dfc['C'].fillna(dfb['C'])
但此方法需要手动指定列名,不适合大数据量或列名不固定的场景。
期望结果示例
处理后的数据会保留各自独有的列原值,共同列求和:
A B C years 2010 0.830207 0.456789 0.123456 2011 1.237387 0.789012 0.345678 2012 1.386908 0.234567 0.890123 ...(其余行同理)
内容的提问来源于stack exchange,提问作者msi_gerva
相关产品推荐
相关产品推荐

