解决Pandas apply调用get_next_trading_date的参数传递错误
解决pandas apply调用函数时的参数冲突问题
我刚踩过类似的坑,来帮你理清楚问题根源和解决办法:
问题重现
你的API函数定义大概是这样的:
def get_next_trading_date(exchange='SZSE', date='2017-05-01'): # 函数实现逻辑
当你尝试用pandas的apply批量处理backTestRecordAfterModified的createdAt列时:
backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(func=get_next_trading_date, exchange='SZSE')
控制台抛出错误:
TypeError: get_next_trading_date() got multiple values for argument 'exchange'
你接着尝试了lambda写法:
backTestRecordAfterModified['createdAt'] = backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date, exchange='SZSE'))
结果还是遇到了相同的错误,直到你改成指定参数名的写法才解决:
backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date=date,exchange='SZSE'))
问题原因
核心问题出在函数的参数顺序上:get_next_trading_date的第一个参数是exchange,第二个才是date。而apply方法默认会把Series中的每个元素作为第一个位置参数传递给目标函数:
- 第一种写法:
apply把每个日期值传给get_next_trading_date的第一个参数(也就是exchange),同时你又显式传了exchange='SZSE',导致exchange同时收到两个值,触发参数冲突。 - 第二种lambda写法:你把lambda的
date参数作为第一个位置参数传给get_next_trading_date,同样会被赋值给exchange参数,加上显式传递的exchange='SZSE',还是重复赋值。
正确解法
解决的关键就是显式指定参数名,让函数明确知道每个值对应哪个参数:
backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date=date,exchange='SZSE'))
这样一来,lambda接收的日期值会准确对应到函数的date参数,exchange参数也通过关键字参数传递,完全避免了参数顺序导致的冲突。
另外,如果你不想用lambda,也可以通过functools.partial来固定参数,写法如下:
from functools import partial backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(partial(get_next_trading_date, exchange='SZSE'))
partial会帮你固定exchange参数,剩下的位置参数就会自动接收apply传递的日期值,同样能解决问题。
内容的提问来源于stack exchange,提问作者inaMinute
相关产品推荐
相关产品推荐

