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

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的内置方法,分三步完成需求,完全避免手动循环:

  1. 对齐所有日期时间记录:先获取两个DataFrame的联合索引,再分别对两个DataFrame重新索引,确保所有Date/Time组合都存在,缺失值用NaN填充。
  2. 累加SKU列:直接对对齐后的SKU列做加法,缺失值自动按0处理。
  3. 保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:59:09