簡體   English   中英

sklearn如何處理missing_values ='?

[英]sklearn how to deal with missing_values='?'

假設我有一個.txt文件,其中是

2,3,4,?,5

我要替換缺少的值'?' 通過所有其他數據,有什么好主意嗎? 如果要使用字符串列表,我想替換為'? 最頻繁的字符串,即“ a”

'a','b','c','?','a','a'

我嘗試了一些方法,但它們不起作用。 我先用

import numpy as np
from sklearn.preprocessing import Imputer

row = np.genfromtxt('a.txt',missing_values='?',dtype=float,delimiter=',',usemask=True)
# this will give: row = [2 3 4 -- 5]. I checked it will use filling_values=-1 to replace missing data
# but if I add 'filling_values=np.nan' in it, it will cause error,'cannot convert float into int'

imp = Imputer(missing_values=-1, strategy='mean')
imp.fit_transform(row)
# this will give: array([2., 3., 4.,5.], which did not replace missing_value by mean value.

如果我可以代替'?' 使用np.nan,我想我可以做到。

我無法重現您描述的錯誤,“無法將float轉換為int”。

嘗試這個:

>>> row = np.genfromtxt('a.txt',missing_values='?',dtype=float,delimiter=',')
>>> np.mean(row[~np.isnan(row)])
3.5
>>> mean = np.mean(row[~np.isnan(row)])
>>> row[np.isnan(row)] = mean
>>> row
array([ 2. ,  3. ,  4. ,  3.5,  5. ])

編輯

如果您希望使用字符串,這是使用普通列表的解決方案。

>>> row = ['a','b','c','?','c','b','?','?','b']
>>> from collections import Counter
>>> letter_counts = Counter(letter for letter in row if letter != '?')
>>> letter_counts.most_common(1)
[('b', 3)]
>>> most_common_letter = letter_counts.most_common(1)[0][0]
>>> [letter if letter != '?' else most_common_letter
...     for letter in row]
['a', 'b', 'c', 'b', 'c', 'b', 'b', 'b', 'b']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM