如何将Pandas Series转换映射至DataFrame,生成SKU月度购买频次CSV
当然可以!你的需求其实可以通过 Pandas 的分组聚合+透视表功能直接实现,而且比现在的循环写法更高效简洁。下面是具体的实现步骤和代码:
核心思路
- 先将日期转换为「年月」格式(如
2017-02),方便后续按月份分组。 - 一次性统计所有 SKU 在每个年月的购买频次,避免逐行循环的低效操作。
- 将统计结果转换为「SKU 为行、年月为列」的宽表格式,并用 0 填充缺失值。
- 确保包含过去 3 年的所有月份(即使某个月份没有任何 SKU 销售)。
完整代码实现
import pandas as pd # 1. 确保日期列是 datetime 类型(如果还没转换的话) df_orders['date'] = pd.to_datetime(df_orders['date']) # 2. 筛选过去 3 年的数据(可选,若原始数据包含更早的记录) latest_date = df_orders['date'].max() three_years_ago = latest_date - pd.DateOffset(years=3) df_orders_filtered = df_orders[df_orders['date'] >= three_years_ago] # 3. 生成「年月」列,格式为 YYYY-MM df_orders_filtered['year_month'] = df_orders_filtered['date'].dt.to_period('M') # 4. 分组统计每个 SKU 在每个年月的购买次数 sku_month_stats = df_orders_filtered.groupby(['item_sku', 'year_month']).size().reset_index(name='count') # 5. 生成过去 3 年的所有月份,确保没有遗漏 all_months = pd.period_range(start=three_years_ago, end=latest_date, freq='M') # 6. 转换为目标宽表格式,用 0 填充无销售的月份 result_df = sku_month_stats.pivot( index='item_sku', columns='year_month', values='count' ).reindex(columns=all_months, fill_value=0).astype(int) # 7. 调整表头和索引,符合 CSV 输出要求 result_df = result_df.reset_index().rename(columns={'item_sku': 'SKU'}) # 8. 导出为 CSV 文件 result_df.to_csv('sku_monthly_purchase_freq.csv', index=False)
代码说明
- 避免循环:用
groupby一次性处理所有 SKU,比iterrows循环高效得多,尤其适合大数据量。 - 完整月份覆盖:通过
pd.period_range生成过去 3 年的所有月份,确保 CSV 包含每一列,不会因为某月份无销售而缺失。 - 自动填充 0:
reindex配合fill_value=0自动为 SKU 无销售的月份填充 0,完美匹配你想要的输出格式。
输出示例
运行后生成的 CSV 内容会和你期望的格式一致:
SKU,2017-01,2017-02,2017-03 17,0,0,1 18,0,1,3
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

