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

如何高效为特定日期缺失的Product ID补零?(Pandas/Numpy优化方案)

高效补全缺失日期的Product ID统计字段(替代循环方案)

需求:为特定日期未出现的Product ID对应的统计字段补零,现有循环实现效率过低,需要基于Pandas的高效替代方案。

示例数据

rpt_date    product_id          total_views  total_cart_adds  total_order_unit  total_gmv  
30-07-2022  mp000000006243574   7           1                0                 0  
30-07-2022  mp000000006292285   1           0                0                 0  
30-07-2022  mp000000006294016   18          1                0                 0  
31-07-2022  mp000000006243574   8           2                0                 0  
31-07-2022  mp000000006292285   5           0                0                 0

比如Product ID mp000000006294016在31日无数据,需要为该日期对应的统计字段补零。

当前低效循环代码

import pandas as pd
import time

df_ans=pd.DataFrame()
for x in prod_df['product_id']:
    df2=pd.DataFrame()
    print(prod_df[prod_df['product_id']==x])

    df2 = prod_df[prod_df['product_id']==x]

    if df2.shape[0] == 1:
        formatted_date1 = time.strptime(prod_df['rpt_date'][0], "%d-%m-%Y")
        formatted_date2 = time.strptime('30-07-2022', "%d-%m-%Y")
        if formatted_date1==formatted_date2:
             df2.loc[-1] = ['31-07-2022', x, '0', '0','0','0']  # 添加行
             df2.index = df2.index + 1  # 调整索引
             df2 = df2.sort_index()
        else:
             df2.loc[-1] = ['30-07-2022', x, '0', '0','0','0']  # 添加行
             df2.index = df2.index + 1  # 调整索引
             df2 = df2.sort_index()
        print(df2)
    df_ans= pd.concat([df_ans,df2])
    print("***************************************")

高效Pandas解决方案

利用Pandas的索引重构功能,避免循环,步骤如下:

  • 转换日期格式:先把rpt_date转为datetime类型,确保日期处理准确
  • 生成完整的日期-产品组合:用所有唯一日期和唯一产品ID生成笛卡尔积,确保没有遗漏的组合
  • 重新索引补零:基于完整组合重新索引原数据,缺失的统计字段自动填充0
  • 重置索引恢复结构:把多级索引转回普通列,得到最终结果

完整代码

import pandas as pd

# 假设prod_df是你的原始DataFrame
# prod_df = pd.read_csv("your_data.csv")

# 转换日期列为datetime类型
prod_df['rpt_date'] = pd.to_datetime(prod_df['rpt_date'], format="%d-%m-%Y")

# 获取所有唯一日期和唯一产品ID
unique_dates = prod_df['rpt_date'].unique()
unique_products = prod_df['product_id'].unique()

# 生成完整的日期-产品组合的多级索引
full_index = pd.MultiIndex.from_product(
    [unique_dates, unique_products],
    names=['rpt_date', 'product_id']
)

# 重新索引补零,再重置索引恢复原结构
result_df = (
    prod_df.set_index(['rpt_date', 'product_id'])
           .reindex(full_index, fill_value=0)
           .reset_index()
)

# 可选:把日期转回原字符串格式(如果需要)
result_df['rpt_date'] = result_df['rpt_date'].dt.strftime("%d-%m-%Y")

print(result_df)

效果说明

运行后,所有日期-产品组合都会被覆盖,缺失数据的统计字段自动补零,全程无循环,处理大数据量时效率提升显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:25:53