【问题标题】:How to impute values in a column and overwrite existing values如何估算列中的值并覆盖现有值
【发布时间】:2019-11-14 14:55:50
【问题描述】:

我正在尝试学习机器学习,我需要为工作流程的清洁阶段填写缺失值。我有 13 列,需要估算其中 8 列的值。一列称为 Dependents,我想用缺失的单词填写空白,并将包含数据的单元格更改如下:1 到 1、2 到 2、3 到 3 和 3+ 到 threePlus。

我在 Anaconda 中运行程序,数据框的名称是 train

train.columns

这给了我

Index(['Loan_ID', '性别', '已婚', '家属', '教育', 'Self_Employed'、'ApplicantIncome'、'CoapplicantIncome'、'LoanAmount'、 'Loan_Amount_Term'、'Credit_History'、'Property_Area'、'Loan_Status']、 dtype='object')

下一个

    print("Dependents")
    print(train['Dependents'].unique())

这给了我

家属 ['0' '1' '2' '3+' 南]

现在我尝试按所述估算值

def impute_dependent():
my_dict={'1':'one','2':'two','3':'three','3+':'threePlus'};
return train.Dependents.map(my_dict).fillna('missing')



def convert_data(dataset):
    temp_data = dataset.copy()
    temp_data['Dependents'] = temp_data[['Dependents']].apply(impute_dependent,axis=1)
return temp_data

这给出了错误

TypeError                                 Traceback (most recent call last)
<ipython-input-46-ccb1a5ea7edd> in <module>()
      4     return temp_data
      5 
----> 6 train_dataset = convert_data(train)
      7 #test_dataset = convert_data(test)

<ipython-input-46-ccb1a5ea7edd> in convert_data(dataset)
      1 def convert_data(dataset):
      2     temp_data = dataset.copy()
----> 3     temp_data['Dependents'] = 
temp_data[['Dependents']].apply(impute_dependent,axis=1)
      4     return temp_data
      5 

D:\Anaconda2\lib\site-packages\pandas\core\frame.py in apply(self, func, 
axis, broadcast, raw, reduce, result_type, args, **kwds)
   6002                          args=args,
   6003                          kwds=kwds)
-> 6004         return op.get_result()
   6005 
   6006     def applymap(self, func):

D:\Anaconda2\lib\site-packages\pandas\core\apply.py in get_result(self)
    140             return self.apply_raw()
    141 
--> 142         return self.apply_standard()
    143 
    144     def apply_empty_result(self):

D:\Anaconda2\lib\site-packages\pandas\core\apply.py in apply_standard(self)
    246 
    247         # compute the result using the series generator
--> 248         self.apply_series_generator()
    249 
   250         # wrap results

D:\Anaconda2\lib\site-packages\pandas\core\apply.py in 
apply_series_generator(self)
     275             try:
    276                 for i, v in enumerate(series_gen):
--> 277                     results[i] = self.f(v)
    278                     keys.append(v.name)
    279             except Exception as e:

TypeError: ('impute_dependent() takes 0 positional arguments but 1 was 
given', 'occurred at index 0')

我希望 one、two、three 和 threePlus 替换现有值,而缺失的值可以填补空白

【问题讨论】:

  • 最好建一个dict:my_dict={'1':'one',...},然后使用df.col.map(my_dict)
  • 我没想到所以 my_dict={'1':'one','2':'two','3','three','3+':'threePlus'}但是 nan 值呢? df.col.map(my_dict) 会变成 train.Dependants.map(my_dict)
  • 我试过这个但它不起作用 def impute_dependants(cols): Dependents = cols[0] if pd.isnull(Dependents): return "missing" else my_dict={'1':'one' ,'2':'two','3','three','3+':'threePlus'} train.Dependants.map(my_dict)
  • @QuangHoang 我试过这个但它不起作用 def impute_dependants(cols): Dependents = cols[0] if pd.isnull(Dependents): return "missing" else my_dict={'1':' one','2':'two','3','three','3+':'threePlus'} train.Dependants.map(my_dict)
  • def impute_dependent(): my_dict={'1':'one','2':'two','3','three','3+':'threePlus'}; return train.Dependants.map(my_dict).fillna('missing')

标签: python-3.x pandas


【解决方案1】:

这样可以吗?

my_dict = {'1':'one','2':'two','3':'three','3+':'threePlus', np.nan: 'missing'}
def convert_data(dataset):
    temp_data = dataset.copy()
    temp_data.Dependents = temp_data.Dependents.map(my_dict)
    return temp_data

作为旁注,您的部分问题可能是使用apply:本质上apply 通过函数传递数据并放入输出的内容。我可能错了,但我认为您的函数需要接受 apply 给出的输入,例如:

def impute_dependent(dep):
    my_dict = {'1':'one','2':'two','3':'three','3+':'threePlus', np.nan: 'missing'}
    return my_dict[dep]

df.dependents = df.dependents.apply(impute_dependents)

这样,对于df.dependents 中的每个值,apply 将采用该值并将其作为参数提供给impute_dependents,然后将returned 值作为输出。照原样,当我试用您的代码时,我收到一个错误,因为 impute_dependent 不接受任何参数。

【讨论】:

  • 非常感谢您的帮助,您提供的解决方案完美运行,如果我在为算法编码时可能会问一个切线问题,说随机森林在这种情况下对数值很重要信用记录栏给我一个 1 表示好或一个 0 表示坏这些只是用来识别它们的标签吗? 列中缺少条目,我不确定推断它们应该是什么的逻辑方法,所以将 2 归为未知数以某种方式弄乱数据,或者在这种情况下这是一种可以接受的标记未知数的方式
猜你喜欢
  • 1970-01-01
  • 2019-12-19
  • 2014-09-11
  • 2012-02-25
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多