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

如何将Pandas Series转换映射至DataFrame,生成SKU月度购买频次CSV

当然可以!你的需求其实可以通过 Pandas 的分组聚合+透视表功能直接实现,而且比现在的循环写法更高效简洁。下面是具体的实现步骤和代码:

核心思路

  1. 先将日期转换为「年月」格式(如 2017-02),方便后续按月份分组。
  2. 一次性统计所有 SKU 在每个年月的购买频次,避免逐行循环的低效操作。
  3. 将统计结果转换为「SKU 为行、年月为列」的宽表格式,并用 0 填充缺失值。
  4. 确保包含过去 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:50