如何使用Python的pivot_table函数生成指定产品的月度销售数据透视表
使用pivot_table实现指定产品的月度销售数据宽表转换
没问题,我来一步步教你怎么用pivot_table实现你要的效果,还能适配大量产品的场景:
第一步:数据预处理
首先得把你的数据调整成适合透视的格式,尤其是月份格式要转成Period(M),还要清理掉客户名和产品名里多余的点(看你示例里的eric.和A.都被处理了):
import pandas as pd # 先构造你的示例DataFrame data = { 'customer': ['sam', 'tim', 'mi.', 'harry', 'eric.'], 'product': ['A', 'A', 'B', 'A', 'A.'], 'month': ['2021-11', '2021-12', '2021-10', '2011-11', '2021-10'], 'revenue': [221, 220, 213, 210, 213] } df = pd.DataFrame(data) # 1. 把month列转成Period(M)类型 df['month'] = pd.to_datetime(df['month']).dt.to_period('M') # 2. 清理customer和product列末尾的多余点(和你的输出示例匹配) df['customer'] = df['customer'].str.rstrip('.') df['product'] = df['product'].str.rstrip('.')
第二步:筛选目标产品
因为你需要指定产品,直接用布尔索引筛选就行,比如我们要产品A:
target_product = 'A' # 可选:如果只需要2021年的数据,加上年份过滤(匹配你的示例输出) df_target = df[(df['product'] == target_product) & (df['month'].dt.year == 2021)].copy()
第三步:用pivot_table生成宽表
这一步是核心,参数设置好就能直接得到你要的格式:
pivot_result = pd.pivot_table( df_target, index=['customer', 'product'], # 行维度:每个客户-产品组合一行 columns='month', # 列维度:把月份转成列 values='revenue', # 填充的数值是收入 aggfunc='sum', # 处理重复数据(如果有同一个客户-产品-月多条数据就求和) fill_value=0 # 缺失的月份填充0 ).reset_index() # 把索引转成普通列,和你的输出格式一致
第四步:调整列顺序(可选)
如果想要月份按时间顺序排列,可以手动排序列:
# 提取月份列并排序 sorted_months = sorted(pivot_result.columns[2:]) # 重新排列列 pivot_result = pivot_result[['customer', 'product'] + sorted_months]
最终输出
运行完上面的代码,pivot_result就是你要的格式:
customer product 2021-10 2021-11 2021-12 0 eric A 213 0 0 1 sam A 0 221 0 2 tim A 0 0 220
关键参数说明
index=['customer', 'product']:确保每个客户和产品的组合作为唯一行,不会出现重复行aggfunc='sum':保险起见,防止出现同一个客户同一个月多次购买的情况,会自动求和fill_value=0:完美解决缺失月份的填充问题,不用额外处理空值
如果要处理其他产品,只需要修改target_product的值就行,完全适配大量产品的场景~
内容的提问来源于stack exchange,提问作者tim83
相关产品推荐
相关产品推荐

