Skip to main content
 首页 » 编程设计

python之创建交互变量的函数 : what is wrong with the code

2025年05月04日27mayingbao

我在下面写了一个函数,它接受一个数据帧 (df) 和它的两个列名 (var1, var2)。然后它为这两个变量创建交互变量并将这些列添加到原始数据框中。当我对它进行硬编码时,该代码可以工作,但是当我尝试像这样调用该函数时:

create_interactions(my_dataframe, 'variable1', 'variable2') 
my_dataframe 

我没有收到任何错误,但新列未添加到数据框中 - 它返回原始数据框。我究竟做错了什么?谢谢。

def create_interactions(df,var1,var2): 
    variables = df[[var1,var2]]  
    for i in range(0, variables.columns.size): 
        for j in range(0, variables.columns.size): 
            col1 = str(variables.columns[i]) 
            col2 = str(variables.columns[j]) 
            if i <= j: 
                name = col1 + "*" + col2 
                df = pd.concat([df, pd.Series(variables[col1] * variables[col2], name=name)], axis=1) 

请您参考如下方法:

执行 df = ... 不会修改原始 df。它只是用你的新 df 创建一个新的局部变量。

您可以从您的函数返回 df,然后像 df = create_interactions(df, 'var1', 'var2') 一样使用它。

但是如果您确实希望您的函数修改原始的 df,最好将最后一行更改为:

df[name] = pd.Series(variables[col1] * variables[col2], name=name) 

这会将新列插入到现有的 DataFrame 中。

您的代码还有其他一些奇怪的地方。您创建一个名为 variables 的新变量,它只包含原始 df 的两列。然后循环 range(0, variables.columns.size)。但是由于您将 variables 定义为只有两列,因此 variables.columns.size 将始终为两列。稍后,您从 variables 中获取列,但这些相同的列已经存在于 df 中,因此您可以从 df 中获取它们。

此外,您的代码创建了每个变量与其自身的“交互”,这看起来有点奇怪。我认为您的代码可以简化为:

def create_interaction(df,var1,var2): 
    name = var1 + "*" + var2 
    df[name] = pd.Series(df[var1] * df[var2], name=name) 

由于您只接受两个变量,因此只有一个交互,因此您根本不需要任何循环。 (我将其重命名为 create_interaction 以表明这一点!:-)只需获取两个指定的变量并将它们相乘即可。