如何用多输入输出函数向量化更新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
相关产品推荐
相关产品推荐

