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

如何为DataFrame中每个分组补全所有日期并填充0值?

高效补充分组缺失日期并填充0的Pandas方案

针对多维度分组(如零售商、产品、门店)+长时序数据的场景,原循环拼接的方法效率低下,推荐使用以下两种向量化操作的方案,避免循环带来的性能损耗:

方案一:透视+堆叠(pivot + stack)

利用Pandas的透视功能先构建完整的日期-分组矩阵,填充缺失值后再转换回原格式:

import pandas as pd

# 初始化数据
df = pd.DataFrame({
    "Date": ["2024-01-01", "2024-01-02", "2024-01-01"],
    "Retailer": ["A", "A", "B"],
    "Sales": [1, 1, 9],
})

# 透视:日期为索引,零售商为列,销售额为值
pivoted = df.pivot(index="Date", columns="Retailer", values="Sales")
# 填充缺失值为0,再堆叠列转为行
df_final = pivoted.fillna(0).stack().reset_index(name="Sales")

print(df_final)

输出结果:

Date Retailer  Sales
0  2024-01-01        A    1.0
1  2024-01-01        B    9.0
2  2024-01-02        A    1.0
3  2024-01-02        B    0.0

方案二:构建完整索引重新对齐(MultiIndex.from_product + reindex)

通过生成日期与分组的笛卡尔积索引,直接对齐原数据并填充缺失值:

import pandas as pd

# 初始化数据
df = pd.DataFrame({
    "Date": ["2024-01-01", "2024-01-02", "2024-01-01"],
    "Retailer": ["A", "A", "B"],
    "Sales": [1, 1, 9],
})

# 设置复合索引
df = df.set_index(["Date", "Retailer"])
# 生成所有日期和零售商的笛卡尔积索引
full_index = pd.MultiIndex.from_product(
    [df.index.get_level_values("Date").unique(), 
     df.index.get_level_values("Retailer").unique()],
    names=["Date", "Retailer"]
)
# 重新索引并填充0,最后重置索引
df_final = df.reindex(full_index, fill_value=0).reset_index()

print(df_final)

输出结果与方案一一致。

方案优势

  • 两种方法均为Pandas内置的向量化操作,避免了循环和多次concat的性能开销,在大数据集下效率远高于原循环方案
  • 支持扩展至多维度分组(如同时按Retailer、Product、Store分组),只需调整透视的列或MultiIndex的层级即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:42:39