Pandas如何将Colour字段行转为列,按周统计各颜色商品的总数量
解决方案
你需要的行转列操作在pandas中有两种常用实现方式,可直接基于你现有代码修改:
方法1:基于现有分组结果用unstack实现
你已经完成了按周+颜色的分组求和,只需要对分组结果执行unstack操作,把Colour这级索引转为列即可:
import pandas as pd import numpy as np # 原代码缺少pd前缀,此处补上 df = pd.read_csv("C:/temp/testfolder/datestimescolorsnumbers2.csv") df['Date'] = pd.to_datetime(df['Date']) df['Week_commencing'] = df['Date'] - df['Date'].dt.weekday * np.timedelta64(1, 'D') # 分组求和仅保留需要的Quantity字段,避免无关字段参与计算 df1 = df.groupby(['Week_commencing', 'Colour'])['Quantity'].sum() # 核心操作:把Colour行转成列,fillna将某周无销量的颜色默认填充为0 df_wide = df1.unstack('Colour', fill_value=0) # 重命名列名为你需要的格式,如果Colour字段存的是英文值,替换字典key为对应英文即可 df_wide = df_wide.rename(columns={ '蓝色': '蓝色商品总量', '红色': '红色商品总量', '绿色': '绿色商品总量' }) # 重置索引把周起始日从索引转为普通列,注意index参数是布尔值False不是字符串 df_wide.reset_index().to_csv("C:/temp/testfolder/outputGroupByWeek2.csv", encoding="utf-8", index=False)
方法2:用pivot_table一步完成
也可以跳过单独写groupby的步骤,直接用透视表同时完成分组+行转列操作:
import pandas as pd import numpy as np df = pd.read_csv("C:/temp/testfolder/datestimescolorsnumbers2.csv") df['Date'] = pd.to_datetime(df['Date']) df['Week_commencing'] = df['Date'] - df['Date'].dt.weekday * np.timedelta64(1, 'D') # 一行完成透视:行索引为周起始日,列是颜色,值为数量求和,空值填0 df_wide = pd.pivot_table( df, index='Week_commencing', columns='Colour', values='Quantity', aggfunc='sum', fill_value=0 ) # 后续重命名列、导出操作和方法1完全一致 df_wide = df_wide.rename(columns={ '蓝色': '蓝色商品总量', '红色': '红色商品总量', '绿色': '绿色商品总量' }) df_wide.reset_index().to_csv("C:/temp/testfolder/outputGroupByWeek2.csv", encoding="utf-8", index=False)
内容的提问来源于stack exchange,提问作者JasP
相关产品推荐
相关产品推荐

