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

在Pandas DataFrame中应用自定义函数时遇TypeError参数缺失问题的解决求助

解决Pandas apply自定义函数时的TypeError问题

你遇到的TypeError: ssc_function() missing 1 required positional argument: 'ssc'错误,核心原因是:当使用df.apply(..., axis=1)时,Pandas会把整行数据作为单个参数传给你的函数,但你的ssc_function需要两个独立的参数(gross_i1和ssc),参数匹配自然就失败了。

下面给你几种可行的解决方法,还顺便优化了原函数里的逻辑漏洞:


方法1:修改函数接收行对象,提取对应列值

把函数改成接收一个行参数,直接从行里取出需要的列值:

import numpy as np
import pandas as pd

def ssc_function(row):
    gross_i1 = row['gross_i1']
    ssc = row['ssc']
    # 补充了默认条件(否则未匹配到的情况会返回NaN)
    conditions = [
        (ssc == 0),
        (gross_i1 <= gross_i1 * 0.10),  # 这里注意:正数的gross_i1永远不满足这个条件,可根据实际需求调整
        True  # 匹配所有其他场景
    ]
    values = [0, gross_i1 * 0.5, gross_i1 * 0.15]
    ssc_estimation = np.select(conditions, values)
    return ssc_estimation

data = {'name': ['Company1', 'Company2', 'Company3', 'Company4', 'Company5'],
        'gross_i1': [0, 180395, 4543168, 7543168, 73],
        'ssc': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, columns = ['name', 'gross_i1', 'ssc'])

df['NewSSC'] = df.apply(ssc_function, axis=1)
print(df)

方法2:用lambda函数传递指定列作为参数

不用修改原函数,而是在apply里用lambda把行的对应列值精准传给函数:

import numpy as np
import pandas as pd

def ssc_function(gross_i1, ssc):
    conditions = [
        (ssc == 0),
        (gross_i1 <= gross_i1 * 0.10),
        True
    ]
    values = [0, gross_i1 * 0.5, gross_i1 * 0.15]
    ssc_estimation = np.select(conditions, values)
    return ssc_estimation

data = {'name': ['Company1', 'Company2', 'Company3', 'Company4', 'Company5'],
        'gross_i1': [0, 180395, 4543168, 7543168, 73],
        'ssc': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, columns = ['name', 'gross_i1', 'ssc'])

# 用lambda把每行的gross_i1和ssc单独传进函数
df['NewSSC'] = df.apply(lambda row: ssc_function(row['gross_i1'], row['ssc']), axis=1)
print(df)

方法3:直接向量化操作(推荐,效率更高)

np.select本身支持向量化运算,完全不需要用apply(逐行操作的apply在大数据量下效率很低),可以直接把整列传入计算:

import numpy as np
import pandas as pd

data = {'name': ['Company1', 'Company2', 'Company3', 'Company4', 'Company5'],
        'gross_i1': [0, 180395, 4543168, 7543168, 73],
        'ssc': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, columns = ['name', 'gross_i1', 'ssc'])

conditions = [
    (df['ssc'] == 0),
    (df['gross_i1'] <= df['gross_i1'] * 0.10),
    True
]
values = [0, df['gross_i1'] * 0.5, df['gross_i1'] * 0.15]
df['NewSSC'] = np.select(conditions, values)
print(df)

另外提一句:你原函数里的第二个条件(gross_i1 <= gross_i1*0.10),当gross_i1是正数时永远不会成立(比如180395的0.1倍是18039.5,180395肯定大于这个数),只有gross_i1为0或负数时才满足,这大概率不是你想要的逻辑,可以根据实际业务需求调整这个条件(比如改成ssc <= 10之类的)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:17:41