我有一个数据集,其中特征既包含数值类型又包含对象类型。此外,一些对象类型的特征存在缺失值。我按照另一篇文章的指示创建了一个修改版的Imputer,用于处理数值和分类数据类型的缺失值,但当我将其应用到我的数据集时,返回了AttributeError。我认为我在定义用于填补的fit方法时犯了一个愚蠢的错误,非常感谢您的见解。以下是我的代码和错误信息:
import osimport pandas as pdimport numpy as npfrom sklearn.preprocessing import Imputer#加载数据path='~/Desktop/ML/Hands_on/housing_train.csv'path=os.path.expanduser(path)data=pd.read_csv(path)#选择包含dtype=object且有缺失数据的列object_data=data.select_dtypes(include=['object'])object_data_null=[]for col in object_data.columns: if object_data[col].isnull().any(): object_data_null.append(col)class GeneralImputer(Imputer): def __init__(self, **kwargs): Imputer.__init__(self, **kwargs) def fit(self, X, y=None): if self.strategy == 'most_frequent': self.fills = pd.DataFrame(X).mode(axis=0).squeeze() self.statistics_ = self.fills.values return self else: return Imputer.fit(self, X, y=y) def transform(self, X): if hasattr(self, 'fills'): return pd.DataFrame(X).fillna(self.fills).values.astype(str) else: return Imputer.transform(self, X)imputer=GeneralImputer(strategy='most_frequent', axis=1)for i in object_data_null: imputer.fit(data[i]) data[i]=imputer.transform(data[i])---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-29-989e78355872> in <module>() 38 object_data_null 39 for i in object_data_null:---> 40 imputer.fit(data[i]) 41 data[i]=imputer.transform(data[i]) 42 <ipython-input-29-989e78355872> in fit(self, X, y) 23 if self.strategy == 'most_frequent': 24 self.fills = pd.DataFrame(X).mode(axis=0).squeeze()---> 25 self.statistics_ = self.fills.values 26 return self 27 else:AttributeError: 'str' object has no attribute 'values'
回答:
对于大小为1的对象,squeeze()
方法将返回一个标量对象,如文档中所述
这意味着,大多数情况下(这里适用于所有列),列的众数将是一个单一的对象,然后squeeze()将只返回该字符串。
因此,无需在其后获取.values
。请更改您的fit()方法,去掉那部分:
def fit(self, X, y=None): if self.strategy == 'most_frequent': self.fills = pd.DataFrame(X).mode(axis=0).squeeze() # 移除了下面的.values self.statistics_ = self.fills return self