如何批量修改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
相关产品推荐
相关产品推荐

