如何为Pandas DataFrame按Campaign分组添加有序周次列(week#)
为每个Campaign分组生成周数序号列
现有如下Pandas数据框:
import pandas as pd d = {'campaign': ['Fresh', 'Fresh', 'Fresh', 'General', 'General', 'Grocery', 'Grocery', 'Grocery'], 'week': ['7-4-22', '7-11-22', '7-18-22', '5-2-22', '5-9-22', '2-7-22',' 2-14-22',' 2-21-22']} df = pd.DataFrame(data=d)
需要实现:无需手动编码,新增一列week#,按每个campaign内的顺序统计周数,最终得到如下结果:
d = {'campaign': ['Fresh', 'Fresh', 'Fresh', 'General', 'General', 'Grocery', 'Grocery', 'Grocery'], 'week': ['7-4-22', '7-11-22', '7-18-22', '5-2-22', '5-9-22', '2-7-22',' 2-14-22',' 2-21-22'], 'week#':[1,2,3,1,2,1,2,3] } df = pd.DataFrame(data=d)
且week#需要作为序数变量。
解决方案
可以用Pandas的groupby()结合cumcount()方法快速实现,同时将结果转为序数类型,步骤如下:
完整代码
import pandas as pd # 初始化原始数据框 d = {'campaign': ['Fresh', 'Fresh', 'Fresh', 'General', 'General', 'Grocery', 'Grocery', 'Grocery'], 'week': ['7-4-22', '7-11-22', '7-18-22', '5-2-22', '5-9-22', '2-7-22',' 2-14-22',' 2-21-22']} df = pd.DataFrame(data=d) # 按campaign分组生成从1开始的周序号 df['week#'] = df.groupby('campaign').cumcount() + 1 # 将week#转为序数变量,确保系统识别其顺序关系 df['week#'] = pd.Categorical(df['week#'], ordered=True, categories=sorted(df['week#'].unique())) # 查看最终结果 print(df)
代码说明
df.groupby('campaign').cumcount():对每个campaign分组内的行按现有顺序从0开始计数,加1后得到从1起始的周序号,完全匹配需求格式pd.Categorical(..., ordered=True):将列转为序数类型,后续做统计分析时,系统会识别其顺序逻辑(1<2<3),而非普通无顺序的分类变量
内容的提问来源于stack exchange,提问作者GioC
相关产品推荐
相关产品推荐

