在函数中更改 pandas 数据框内容

Change pandas dataframe content in a function

我正在写一个 class 来执行一个热编码,但它没有像我预期的那样工作。

在我的主要代码中我有这个:

for col in train_x_categorical.columns:
   dataCleaner.addFeatureToBeOneHotEncoded(col)

dataCleaner.applyOneHotEncoding(train_x_categorical)

train_x_categorical.head()

class方法如下:

def addFeatureToBeOneHotEncoded(self, featureName):
    self._featuresToBeOneHotEncoded.append(featureName)

def applyOneHotEncoding(self, data):
    for feature in self._featuresToBeOneHotEncoded:
        dummies = pd.get_dummies(data[feature])
        dummies.drop(dummies.columns[-1],axis=1,inplace=True) 
        data.drop(feature, axis=1, inplace=True) 
        data = pd.concat([data, dummies], axis=1)
        print(data.columns)

现在,使用 print(data.columns) 我可以看到该方法工作正常,但是当 train_x_categorical.head() 运行时我看不到方法 applyOneHotEncoding.[=19= 的效果]

我不明白为什么会这样,也不知道如何解决。 我认为由于 python 通过引用传递值,变量 data 指向与变量 train_x_categorical 相同的对象,所以在方法 applyOneHotEncoding 中我正在处理相同的对象对象,但显然我错了。 有人可以向我解释为什么我的推理是错误的以及我该如何解决这个问题吗?

因为applyOneHotEncoding更新了引用变量-data。这并不像您认为的那样起作用。这是 Python 中的 well-known 功能。我知道有几种解决方法 - 一种是让你的方法 return 值。这在您的情况下不起作用,因为您是在循环中执行此操作。另一种选择是将要更新的变量放在包装器 class 中并将其传递给方法。然后更新作为包装器一部分的变量 class 将起作用。

详尽的讨论见此:How do I pass a variable by reference?