更改函数中的pandas数据框架内容



我正在写一个类,做一个热编码,但它不像我预期的那样工作。

在我的主代码中,我有这样的代码:

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

类方法如下:

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方法的效果。

我不明白为什么会发生这种情况以及如何解决它。我认为,由于python通过引用传递值,变量data指向与变量train_x_categorical相同的对象,因此在方法applyOneHotEncoding中,我正在处理相同的对象,但显然我错了。有人能告诉我为什么我的推理是错误的,我该如何解决这个问题吗?

这是因为applyOneHotEncoding更新了引用变量data。这跟你想的不一样。这是Python中一个众所周知的特性。我知道有几种方法可以解决这个问题,一种是让你的方法返回值。这在你的例子中不起作用,因为你是作为循环的一部分来做的。另一种选择是将要更新的变量放在包装器类中,并将其传递给方法。然后更新作为包装器类一部分的变量就可以工作了。

详细讨论如下:如何通过引用传递变量?

最新更新