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

如何用多输入输出函数向量化更新Pandas DataFrame列?

解决Pandas中向量化生成季节和季节年份的问题

错误原因

你用apply时犯了一个常见错误:在lambda里直接传入DF['YEAR']和DF['MONTH'](整个Series对象),但你的getSeason函数是为单个整数设计的。字典的键必须是可哈希类型,而Series是不可哈希的,所以触发了unhashable type: 'Series'错误。

快速修复:正确使用apply

如果想保留原getSeason函数,只需修改apply的写法,让它逐行处理(指定axis=1),并传入当前行的单个year和month值:

import pandas as pd

# 你的原函数不变
def getSeason(year, mth):
    sYear = year
    mthsDict = {1:"winter",2:"winter",3:"spring",4:"spring",5:"spring",6:"summer",7:"summer",8:"summer",9:"fall",10:"fall",11:"fall",12:"winter"}
    season = mthsDict.get(mth)
    if mth == 12:
        sYear = sYear + 1
    return (sYear, season)

# 正确的apply调用
result = DF.apply(lambda row: getSeason(row['YEAR'], row['MONTH']), axis=1)
# 将返回的元组列表拆分成两列
DF[['SYR', 'SEASON']] = pd.DataFrame(result.tolist(), index=DF.index)

更高效的向量化方案(推荐)

apply本质还是逐行处理,对于大数据量,推荐用完全向量化的Pandas操作,速度提升明显:

# 定义月份-季节映射
season_map = {1:"winter",2:"winter",3:"spring",4:"spring",5:"spring",6:"summer",7:"summer",8:"summer",9:"fall",10:"fall",11:"fall",12:"winter"}

# 1. 生成SEASON列:直接对MONTH列做映射
DF['SEASON'] = DF['MONTH'].map(season_map)

# 2. 生成SYR列:12月的年份+1,其他保持原年份
DF['SYR'] = DF['YEAR'] + (DF['MONTH'] == 12).astype(int)

原理说明

  • map方法直接对整个MONTH列做批量映射,无需逐行处理
  • (DF['MONTH'] == 12)生成布尔列,astype(int)将True转为1、False转为0,加到YEAR列上就实现了12月年份+1的逻辑

效率对比

三种实现方式的效率从低到高排序:

  • iterrows循环:最慢,逐行操作且涉及大量索引查找
  • apply逐行处理:比iterrows快,但仍有逐行开销
  • 完全向量化操作:最快,利用Pandas的底层优化,适合大数据集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:48:25