Python处理DataFrame日期列新增year变量全部行值相同如何解决?
问题根因
- 你编写的循环逻辑中,每次执行
df['Year'] = xxx都是对整个Year列做全量赋值,而非仅修改当前遍历行对应的取值。循环执行完毕后,整列的值会被最后一次循环的计算结果覆盖,这就是所有行取值均为2015的原因:你的数据集最后一行date字段拆分得到的YY为15,小于19,所以最终整列都被赋值为2015。 - 额外说明:Pandas中直接遍历Series做逐行处理是极低效的实现方式,数据量较大时性能会非常差,更推荐使用向量化操作完成需求。
推荐实现方案
无需编写循环,使用Pandas字符串方法+向量化判断即可实现,性能更高且不会出现赋值错误:
import pandas as pd import numpy as np df = df[df['date'].notna()].copy() # 新增copy避免链式索引警告 # 提取date字段按/拆分的最后一段作为YY df['YY'] = df['date'].str.split('/').str[-1] # 按规则生成Year列 df['Year'] = np.where(df['YY'].astype(int) < 19, '20' + df['YY'], '19' + df['YY'])
如果你坚持要使用循环实现,需要通过索引定位逐行赋值:
df = df[df['date'].notna()].copy() # 遍历同时获取行索引和对应date值 for idx, date in df['date'].items(): YY = date.split('/')[-1] if int(YY) < 19: df.loc[idx, 'Year'] = '20' + YY else: df.loc[idx, 'Year'] = '19' + YY
内容的提问来源于stack exchange,提问作者Ruth Lulu
相关产品推荐
相关产品推荐

