我在下面写了一个函数,它接受一个数据帧 (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 以表明这一点!:-)只需获取两个指定的变量并将它们相乘即可。
