如何高效为特定日期缺失的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
相关产品推荐
相关产品推荐

