Python中为Pandas DataFrame应用双变量函数报错的解决咨询
问题原因分析
- 首次调用
apply时未指定axis=1,默认按列处理数据,导致函数day_type收到的是整列(Series)而非单行的两个参数,因此报missing 1 required positional argument错误。 - 使用lambda时仍未设置
axis=1,导致代码尝试比较整个Series,Pandas无法判断布尔值的真实性,触发ValueError。
解决方案
方案1:修改函数接收整行数据,按行应用
调整函数以接收单行数据,提取所需字段后判断:
def day_type(row): # 将datetime类型的Date转为字符串格式,或直接用datetime对象对比节假日 date_str = row['Date'].strftime('%Y-%m-%d') day_week = row['DoW'] # 用集合存储节假日,比多个or更高效清晰 holidays = {'2013-01-01', '2013-05-27', '2013-07-04', '2013-09-02', '2013-11-28', '2013-12-25'} if date_str in holidays: return "H" elif day_week in ("Saturday", "Sunday"): return "WE" else: return "WD" # 指定axis=1按行应用函数 LoadData["DayType"] = LoadData.apply(day_type, axis=1)
方案2:保留原函数,用lambda传递单行参数
如果不想修改原函数,可通过lambda将单行的两个字段分别传入:
def day_type(day_month, day_week): holidays = {'2013-01-01', '2013-05-27', '2013-07-04', '2013-09-02', '2013-11-28', '2013-12-25'} if day_month in holidays: return "H" elif day_week == "Saturday" or day_week == "Sunday": return "WE" else: return "WD" # 用lambda拆解单行数据,传递给原函数 LoadData["DayType"] = LoadData.apply(lambda x: day_type(x['Date'].strftime('%Y-%m-%d'), x['DoW']), axis=1)
方案3:矢量化操作(大数据集更高效)
使用numpy.select进行矢量化判断,避免逐行循环,性能更优:
import numpy as np import pandas as pd # 将节假日字符串转为datetime类型,与Date列类型匹配 holidays = pd.to_datetime(['2013-01-01', '2013-05-27', '2013-07-04', '2013-09-02', '2013-11-28', '2013-12-25']) # 定义判断条件和对应结果 conditions = [ LoadData['Date'].isin(holidays), LoadData['DoW'].isin(['Saturday', 'Sunday']) ] choices = ['H', 'WE'] # 生成DayType列,默认值为WD LoadData['DayType'] = np.select(conditions, choices, default='WD')
内容的提问来源于stack exchange,提问作者user22435779
相关产品推荐
相关产品推荐

