如何使用FunctionTransformer结合自定义函数实现列间计算并添加新列?
使用FunctionTransformer实现DataFrame列间计算并添加新列
你遇到的TypeError: diff() got multiple values for argument 'x'是因为FunctionTransformer的transform方法会自动把整个输入数据集(这里是DataFrame)作为第一个位置参数传给自定义函数,而你通过kw_args传入的x='ndp'又给diff函数的x参数赋值,导致参数冲突。
下面是几种可行的解决方案:
方案1:修改自定义函数,接收整个DataFrame处理
调整diff函数,让它以DataFrame为输入,通过参数指定要计算的列名:
def diff(df, col_x, col_y): return df[col_x] - df[col_y]
然后正确初始化FunctionTransformer并执行计算:
from sklearn.preprocessing import FunctionTransformer import pandas as pd X = pd.DataFrame({"product":["a","b","c","d"], "ndp":[100,200,150,120], "discount":[5,10,15,30]}) # 初始化转换器,传入列名参数 transf = FunctionTransformer(diff, kw_args={'col_x': 'ndp', 'col_y': 'discount'}) # 计算新列数据 price_values = transf.transform(X) # 将新列添加到原DataFrame X['price'] = price_values
执行后数据集会新增price列:
product ndp discount price 0 a 100 5 95 1 b 200 10 190 2 c 150 15 135 3 d 120 30 90
方案2:用lambda函数包装原diff函数
如果不想修改原diff函数,可以用lambda包装,直接在转换器中提取列传入:
from sklearn.preprocessing import FunctionTransformer import pandas as pd def diff(x, y): return x - y X = pd.DataFrame({"product":["a","b","c","d"], "ndp":[100,200,150,120], "discount":[5,10,15,30]}) # 用lambda接收DataFrame,提取指定列后调用diff transf = FunctionTransformer(lambda df: diff(df['ndp'], df['discount'])) X['price'] = transf.transform(X)
此方法同样能得到目标结果。
方案3:在函数内直接添加新列
如果希望转换器直接返回包含新列的DataFrame,可以修改函数逻辑:
def add_new_col(df, col_x, col_y, new_col_name): df[new_col_name] = df[col_x] - df[col_y] return df transf = FunctionTransformer(add_new_col, kw_args={'col_x': 'ndp', 'col_y': 'discount', 'new_col_name': 'price'}) # 直接获取带新列的数据集 X_with_price = transf.transform(X)
内容的提问来源于stack exchange,提问作者Slevin_42
相关产品推荐
相关产品推荐

