Python/Colab循环实现月年格式日期添加序号前缀的方法
问题说明
- 待处理表结构:包含
Month、Department、Total Expenditure三个字段,Month字段为Jan-18格式的月年值,数据覆盖2018年1月-2022年5月,共13个部门(含DOJ),单自然月对应12条记录 - 报错场景:直接执行透视代码
df1.pivot(index='Month',columns='Department', values='Total Expenditure Estimate')时,Python抛出ValueError: Index contains duplicate entries, cannot reshape错误,同一份数据在Tableau中会出现数值自动汇总累加的异常 - 处理目标:为每个自然月下的12条记录,在原
Month值前依次拼接1-12的序号,生成1-Jan-18、2-Jan-18格式的唯一行标识,满足透视操作的索引唯一性要求
代码实现
优先使用pandas矢量化操作,性能远高于显式循环,实现逻辑和需求一致:
import pandas as pd # 按Month分组,组内按行顺序生成从1开始的连续序号 df1['row_seq'] = df1.groupby('Month').cumcount() + 1 # 拼接序号与原月份值,生成唯一标识 df1['Month'] = df1['row_seq'].astype(str) + '-' + df1['Month'] # 完成后删除临时序号列 df1.drop(columns=['row_seq'], inplace=True) # 后续直接透视即可,不会再触发重复索引报错 pivot_result = df1.pivot( index='Month', columns='Department', values='Total Expenditure Estimate' )
如果需要严格使用循环逻辑实现,可使用以下代码:
import pandas as pd df1 = df1.reset_index(drop=True) # 按Month字段拆分分组 month_group = df1.groupby('Month').indices for month_name, index_list in month_group.items(): # 遍历单月下的所有行,依次添加1-12前缀 for seq_id, row_index in enumerate(index_list, start=1): df1.loc[row_index, 'Month'] = f"{seq_id}-{month_name}" # 执行透视 pivot_result = df1.pivot( index='Month', columns='Department', values='Total Expenditure Estimate' )
注意事项
- 如果需要固定序号和部门的对应关系,在生成分组序号前,先对DataFrame按
Month、Department字段排序,保证每个月内部门顺序固定,序号拼接结果符合预期 - 处理后的
Month字段无重复值,导入Tableau时不会再触发维度重复导致的自动汇总累加问题
内容的提问来源于stack exchange,提问作者Mihan
相关产品推荐
相关产品推荐

