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

如何批量修改Pandas DataFrame列值?——将int64类型月份列转换为对应季节的实现方案

解决Pandas月份转季节的问题(含跨年度12月处理)

嘿,这个问题我太熟了!因为12月跨在了年初,直接用pd.cut的默认左闭右开逻辑确实会碰壁,不过不用发愁,咱们有好几种简洁的方案,完全不用写啰嗦的for循环,甚至能一行代码搞定,来看看:

方法1:字典映射(直观好维护)

这是最直接的思路,先给每个月份对应好季节,再用map()方法批量转换,可读性拉满:

import pandas as pd

# 示例DataFrame
df = pd.DataFrame({'month': [1, 3, 6, 12]})

# 构建月份-季节映射字典
season_map = {
    1: 'winter', 2: 'winter', 12: 'winter',
    3: 'spring', 4: 'spring', 5: 'spring',
    6: 'summer', 7: 'summer', 8: 'summer',
    9: 'autumn', 10: 'autumn', 11: 'autumn'
}

# 批量转换
df['season'] = df['month'].map(season_map)

运行后你的DataFrame就会多出season列,完美匹配需求~

方法2:调整pd.cut区间(适合连续区间场景)

如果想用pd.cut,只需要调整bins的划分逻辑,把12月单独划入冬季区间就行:

df['season'] = pd.cut(
    df['month'],
    bins=[0, 2, 5, 8, 11, 12],  # 划分区间:(0,2], (2,5], (5,8], (8,11], (11,12]
    labels=['winter', 'spring', 'summer', 'autumn', 'winter'],
    include_lowest=True  # 确保1月能被包含在第一个区间里
)

这里通过把最后一个区间设为(11,12],直接让12月归到冬季,完美解决跨年度的问题。

方法3:Lambda表达式一行搞定(满足你的简洁需求)

如果你就想用lambda写一行,嵌套三元表达式就能实现:

df['season'] = df['month'].apply(
    lambda x: 'winter' if x in {1,2,12} 
    else 'spring' if x in {3,4,5} 
    else 'summer' if x in {6,7,8} 
    else 'autumn'
)

用集合{1,2,12}代替列表,判断速度会更快一点,一行代码直接完成转换,简洁又高效。

另外提一句:你之前用for循环没效果,大概率是因为循环里没有正确把结果赋值回DataFrame的列(比如只是遍历修改了单个值但没存到列里),而上面这些方法都是Pandas的矢量化操作,不仅代码简洁,运行效率也比for循环高得多哦~

内容的提问来源于stack exchange,提问作者Shady Mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:17:43