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

Pandas循环提取索引生成年月列时数据被覆盖如何解决

问题根因

你的代码出现整列值被最后一次循环结果覆盖,核心原因是赋值逻辑写错了:
在pandas中执行df_tmp['year'] = yy时,只要yy是单个标量值,这个操作会把整列year的所有行都设置为同一个yy值。你每轮循环都执行一次整列赋值,循环结束后整列自然只会保留最后一轮提取的年份值。
另外你代码里还有两个无效/缺失逻辑:

  • 循环内部写i = i+1完全不生效,for i in range(len(df_tmp.index))的i是迭代器按顺序自动生成的,手动修改i的值不会改变循环的迭代流程
  • 全程没有给month列做赋值操作,就算year列逻辑改对,month列也不会生成对应值
推荐实现方案

pandas优先使用向量化操作实现,不要写逐行for循环,性能差还容易出这类低级错误,根据你的索引类型选对应写法即可:

场景1:索引本身是日期时间类型(DatetimeIndex)

直接调用索引自带的年、月属性即可,代码最简洁性能最好:

df_tmp['year'] = df_tmp.index.year
df_tmp['month'] = df_tmp.index.month

场景2:索引是字符串格式(比如202310、2023-10这类年月字符串)

用pandas内置的字符串向量化方法批量截取,不需要循环:

# 先把索引统一转成字符串格式
idx_str = df_tmp.index.astype(str)
# 批量截取前4位作为年份,后2位作为月份
df_tmp['year'] = idx_str.str[:4]
df_tmp['month'] = idx_str.str[-2:]

逐行循环修正写法(仅作逻辑参考,不推荐生产环境用)

如果你一定要保留逐行处理的逻辑,必须通过.loc定位到当前行的对应单元格再赋值,不能直接做整列赋值:

for i in range(len(df_tmp.index)):
    current_idx = str(df_tmp.index[i])
    yy = current_idx[:4]
    mm = current_idx[-2:]
    # 定位到当前索引行、year/month列的单元格赋值
    df_tmp.loc[df_tmp.index[i], 'year'] = yy
    df_tmp.loc[df_tmp.index[i], 'month'] = mm

内容的提问来源于stack exchange,提问作者Tony Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:06:25