如何重塑DataFrame以生成适配堆叠柱状图的宽格式结构?
解决方法
要实现将长格式DataFrame转换为按日期聚合的宽格式,用Pandas的透视表功能就能轻松搞定,步骤如下:
1. 准备示例数据(可替换为你的实际数据)
import pandas as pd data = { 'date': ['2021-03-01', '2021-03-01', '2021-04-01', '2021-04-01', '2021-05-01'], 'product': ['A', 'B', 'A', 'B', 'C'], 'quantity': [55, 43, 55, 46, 10] } df = pd.DataFrame(data)
2. 核心转换步骤
第一步:生成透视表,按日期聚合产品数量
用pivot_table将日期作为行、产品作为列,聚合数量值,缺失的产品数量自动填充为0:
# 透视表聚合,sum用于处理同一日期同一产品的多条数据 pivot_df = df.pivot_table( index='date', columns='product', values='quantity', aggfunc='sum' ).fillna(0)
第二步:重命名列名,添加quantity_前缀
为了匹配你想要的列名格式,给每个产品列加上前缀:
pivot_df.columns = [f'quantity_{col}' for col in pivot_df.columns]
第三步:将日期从索引转为普通列(可选)
如果不需要日期作为索引,重置索引即可:
pivot_df = pivot_df.reset_index()
3. 补充:添加product列(匹配你的示例结构)
你的目标结构里保留了product列,假设每个日期取第一个出现的产品,可以通过分组提取后合并:
# 提取每个日期的第一个产品 product_info = df.groupby('date')['product'].first().reset_index() # 合并到透视表结果 final_df = pd.merge(pivot_df, product_info, on='date') # 调整列顺序,把product放到date后面 cols = ['date', 'product'] + [col for col in final_df.columns if col not in ['date', 'product']] final_df = final_df[cols]
最终得到的final_df结构和你要求的完全一致:
date product quantity_A quantity_B quantity_C 0 2021-03-01 A 55.0 43.0 0.0 1 2021-04-01 A 55.0 46.0 0.0 2 2021-05-01 C 0.0 0.0 10.0
内容的提问来源于stack exchange,提问作者titu84hh
相关产品推荐
相关产品推荐

