在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
相关产品推荐
相关产品推荐

