Pandas合并DataFrame:仅累加SKU列,保留其他列及补全缺失记录
合并Pandas DataFrame:仅累加SKU列,补全日期时间并保留Demand/Supply非缺失值
问题背景
你手头有两个以Date和Time为索引的Pandas DataFrame,想要实现这样的合并逻辑:
- 补全两个DataFrame中所有缺失的
Date/Time记录(也就是做外连接) - 只对
SKU列进行累加操作 Demand和Supply列保留原有值:如果某条记录在其中一个DataFrame里存在就取该值,要是两边都有则优先用第一个DataFrame的值
你一开始尝试用df.add(df2, fill_value=0),结果Demand和Supply也被累加了,不符合需求;现在用merge加循环实现了功能,但觉得写法不够Pythonic,想找更优的解法。
更简洁的Pythonic解法
我们可以利用Pandas的内置方法,分三步完成需求,完全避免手动循环:
- 对齐所有日期时间记录:先获取两个DataFrame的联合索引,再分别对两个DataFrame重新索引,确保所有
Date/Time组合都存在,缺失值用NaN填充。 - 累加SKU列:直接对对齐后的
SKU列做加法,缺失值自动按0处理。 - 保留Demand/Supply的有效数据:用
combine_first方法,优先取第一个DataFrame的值,若该位置缺失则用第二个DataFrame的值,完美匹配你的需求。
完整代码示例
import pandas as pd import numpy as np # 你的原始数据 dff1 = pd.DataFrame( {'Date':[20160501,20160501,20160501,20160501,20160502,20160502], 'Time':['0900','0905','0910','0915','0920','0925'], 'SKU':[1,2,3,4,5,6], 'Demand':[10,35,20,15,5,55], 'Supply':[10,20,15,20,0,45]} , columns=['Date', 'Time','SKU', 'Demand', 'Supply'] ).set_index(['Date', 'Time']) dff2 = pd.DataFrame( {'Date':[20160501,20160501,20160501,20160501,20160502,20160502,20160503], 'Time':['0900','0902','0910','0915','0920','0925','0900'], 'SKU':[1,2,3,4,5,6,7], 'Demand':[10,35,20,15,5,55,60], 'Supply':[10,20,15,20,0,45,50]} , columns=['Date', 'Time','SKU', 'Demand', 'Supply'] ).set_index(['Date', 'Time']) # 1. 获取联合索引并对齐两个DataFrame combined_index = dff1.index.union(dff2.index) dff1_aligned = dff1.reindex(combined_index) dff2_aligned = dff2.reindex(combined_index) # 2. 累加SKU列,缺失值视为0 sku_combined = dff1_aligned['SKU'].add(dff2_aligned['SKU'], fill_value=0) # 3. 合并Demand和Supply,优先用dff1的值 demand_combined = dff1_aligned['Demand'].combine_first(dff2_aligned['Demand']) supply_combined = dff1_aligned['Supply'].combine_first(dff2_aligned['Supply']) # 组装最终结果,可选重置索引把Date/Time变回列 dff3 = pd.DataFrame({ 'SKU': sku_combined, 'Demand': demand_combined, 'Supply': supply_combined }).reset_index() print(dff3)
为什么这个解法更好?
- 效率更高:用Pandas的向量化操作替代手动循环,数据量越大优势越明显
- 逻辑清晰:每一步对应一个需求点,可读性强
- 避免人为错误:比如你原来循环里把
Supply的赋值写成了a(应该是c),这个方法完全规避了这类问题
内容的提问来源于stack exchange,提问作者Maxim Zhukov
相关产品推荐
相关产品推荐

