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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:46