Python中for循环返回最后条件值:DataFrame月份转数字异常
解决DataFrame月份字符串转数字全为11的问题
嘿,我完全懂你现在的困惑!当初我刚学Pandas的时候也踩过一模一样的坑😆 先给你拆解问题,再给几个靠谱的解决方案。
问题根源:你可能在循环里整列赋值了!
你说判断"DEC"的时候返回True,但结果全是11,大概率是你的循环代码里犯了一个新手常见错误——每次判断后直接给整个新列赋值,而不是针对当前行更新。举个例子,你的代码可能长这样:
import pandas as pd # 模拟你的数据 df = pd.DataFrame({'month': ['OCTOBER', 'NOVEMBER', 'DECEMBER', 'OCTOBER']}) df['month_num'] = 0 # 错误的循环写法 for index, row in df.iterrows(): if row['month'] == 'OCTOBER': df['month_num'] = 10 # 这里是给整列赋值! elif row['month'] == 'NOVEMBER': df['month_num'] = 11 elif row['month'] == 'DECEMBER': df['month_num'] = 12
这种写法下,每一次循环都会把month_num列的所有值改成当前匹配的数字。比如最后一次循环如果碰到的是NOVEMBER,整列就会被全部覆盖成11,之前的赋值全白做了——这就是为什么你看到单个判断是对的,但最终结果全是同一个数。
正确的解决方法
1. 修复循环:针对行索引赋值
如果一定要用循环(不推荐大数据量),要改用df.loc[index, 列名]来定位到当前行赋值:
for index, row in df.iterrows(): if row['month'] == 'OCTOBER': df.loc[index, 'month_num'] = 10 # 只更新当前行 elif row['month'] == 'NOVEMBER': df.loc[index, 'month_num'] = 11 elif row['month'] == 'DECEMBER': df.loc[index, 'month_num'] = 12
2. 更高效的方法:用字典映射(推荐)
Pandas里处理这种映射场景,用map()或者replace()比循环高效太多,代码也更简洁:
# 先定义月份到数字的映射字典 month_mapping = { 'OCTOBER': 10, 'NOVEMBER': 11, 'DECEMBER': 12, # 其他月份可以继续补充,比如JANUARY:1 之类的 } # 一行生成新列 df['month_num'] = df['month'].map(month_mapping)
3. 全自动转换:用日期函数(最省心)
如果你的月份是标准的英文全称,直接用pd.to_datetime()自动解析月份,根本不用写字典:
# %B 匹配英文月份全称,比如OCTOBER、NOVEMBER df['month_num'] = pd.to_datetime(df['month'], format='%B').dt.month
这样不管你有多少个月份,都能直接转换成对应的数字,超级省心!
内容的提问来源于stack exchange,提问作者leeneumann
相关产品推荐
相关产品推荐

