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
相关产品推荐
相关产品推荐

