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

如何将多份按Product分组求和的结果合并为日期列的DataFrame

最优实现思路

方法一:统一加日期列后合并再透视

这是最简洁高效的方案,核心是先把所有数据整合到一个大表,再一次性转换格式:

  1. 给每个对应日期的DataFrame新增Date列,值就是该表对应的日期(比如'2023-01-01')
  2. 用pd.concat()把所有带日期列的小表合并成一个大DataFrame
  3. 用pivot_table直接将数据转换成Product为索引、日期为列的格式,同时完成分组求和

示例代码:

import pandas as pd

# 模拟12个日期的DataFrame(实际中你可以用字典或列表存储这些表)
dfs = {
    '2023-01-01': pd.DataFrame({'Product': ['A', 'B'], 'Amount': [5, 2]}),
    '2023-01-02': pd.DataFrame({'Product': ['A', 'C'], 'Amount': [3, 7]}),
    # ... 剩余10个日期的DataFrame
}

# 给每个表加日期列并合并
combined_df = pd.concat(
    [df.assign(Date=date) for date, df in dfs.items()],
    ignore_index=True
)

# 一步得到目标格式
result_df = combined_df.pivot_table(
    index='Product',
    columns='Date',
    values='Amount',
    aggfunc='sum',  # 确保同一日期同一商品的金额求和
    fill_value=0    # 无数据的位置填0,按需选择
)

方法二:分组后合并再unstack

如果习惯先对单个表分组求和,也可以用这个思路,比逐个合并更高效:

# 先对每个日期的表分组求和,同时保留日期信息
grouped_list = []
for date, df in dfs.items():
    grouped = df.groupby('Product')['Amount'].sum().reset_index()
    grouped['Date'] = date
    grouped_list.append(grouped)

# 合并所有分组结果
combined_grouped = pd.concat(grouped_list, ignore_index=True)

# 转换为目标格式
result_df = combined_grouped.set_index(['Product', 'Date'])['Amount'].unstack(fill_value=0)

为什么这两种方法更优?

  • 避免了多次调用merge()的性能损耗:数据量越大,多次合并的时间成本越高,而concat是线性时间复杂度,效率高很多
  • 代码逻辑更清晰:从整合到转换一步到位,减少中间变量和出错概率
  • 灵活处理缺失值:可以通过fill_value直接填充无数据的单元格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:21:09