我正在写一个类,做一个热编码,但它不像我预期的那样工作。
在我的主代码中,我有这样的代码:
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中一个众所周知的特性。我知道有几种方法可以解决这个问题,一种是让你的方法返回值。这在你的例子中不起作用,因为你是作为循环的一部分来做的。另一种选择是将要更新的变量放在包装器类中,并将其传递给方法。然后更新作为包装器类一部分的变量就可以工作了。
详细讨论如下:如何通过引用传递变量?