You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:48:24