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

Python中为Pandas DataFrame应用双变量函数报错的解决咨询

问题原因分析

  1. 首次调用apply时未指定axis=1,默认按列处理数据,导致函数day_type收到的是整列(Series)而非单行的两个参数,因此报missing 1 required positional argument错误。
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:43:23