0

我有一個數據集,其中包含數字和要素中的對象。另外,對象數據類型的某些功能缺少值。我創建了Imputer的修改版本(按照另一篇文章中的說明)來處理數字和類別數據類型的缺失值,但是當我應用到我的數據集時,它會返回AttributeError。我相信我在定義適應方法的定義時犯了一個愚蠢的錯誤,我感謝你的洞察力。這裏是我的代碼和錯誤:如何在scikit-learn中插入具有範疇數據類型的列

import os 
import pandas as pd 
import numpy as np 
from sklearn.preprocessing import Imputer 

#load the data 
path='~/Desktop/ML/Hands_on/housing_train.csv' 
path=os.path.expanduser(path) 
data=pd.read_csv(path) 

#select the columns_names including dtype=object && missing data 
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

對於1級物體的squeeze()方法將返回一個縮放對象爲mentioned in the documentation

因此,這意味着,對於大多數的時間(這恰好爲所有列),列的模式將是單個對象,然後squeeze()將只返回字符串。

所以沒有必要得到.values之後。改變你的fit()方法刪除:

def fit(self, X, y=None): 
    if self.strategy == 'most_frequent': 
     self.fills = pd.DataFrame(X).mode(axis=0).squeeze() 

     # Removed .values from the below line 
     self.statistics_ = self.fills 
     return self 
+0

非常感謝@Vivek Kumar –

相關問題