我正在尝试 iPython Notebooks 中的算法,并想知道我是否可以在随机位置用 Nan(大约 50% 或更多)替换数据集中的现有值,每列具有不同比例的 Nan 值。
我正在使用 Iris 数据集进行此实验,以了解算法的工作原理以及哪个算法效果最好。数据集的链接在这里。
在此先感谢您的帮助。
我正在尝试 iPython Notebooks 中的算法,并想知道我是否可以在随机位置用 Nan(大约 50% 或更多)替换数据集中的现有值,每列具有不同比例的 Nan 值。
我正在使用 Iris 数据集进行此实验,以了解算法的工作原理以及哪个算法效果最好。数据集的链接在这里。
在此先感谢您的帮助。
numpy数组中的值# The dataset
data = pd.read_csv('iris.data')
mat = data.iloc[:,:4].as_matrix()
设置要替换的值的数量。例如 20%:
# Edit: changed len(mat) for mat.size
prop = int(mat.size * 0.2)
随机选择 numpy 数组的索引:
i = [random.choice(range(mat.shape[0])) for _ in range(prop)]
j = [random.choice(range(mat.shape[1])) for _ in range(prop)]
使用 NaN 更改值
mat[i,j] = np.NaN
使用超过 2 维的数组执行此操作的另一种方法是使用该numpy.put()函数:
import numpy as np
import random
from sklearn import datasets
data = datasets.load_iris()['data']
def dropout(a, percent):
# create a copy
mat = a.copy()
# number of values to replace
prop = int(mat.size * percent)
# indices to mask
mask = random.sample(range(mat.size), prop)
# replace with NaN
np.put(mat, mask, [np.NaN]*len(mask))
return mat
此函数返回一个修改后的数组:
modified = dropout(data, 0.2)
我们可以验证是否修改了正确数量的值:
np.sum(np.isnan(modified))/float(data.size)
[出去]:
0.2
根据您保留值的数据结构,可能会有不同的解决方案。
如果您使用的是Numpy数组,则可以使用此处np.insert引用的方法:
import numpy as np
a = np.arrray([(122.0, 1.0, -47.0), (123.0, 1.0, -47.0), (125.0, 1.0, -44.0)]))
np.insert(a, 2, np.nan, axis=0)
array([[ 122., 1., -47.],
[ 123., 1., -47.],
[ nan, nan, nan],
[ 125., 1., -44.]])
如果您正在使用,您可以在此处引用的对象上Pandas使用实例方法:replaceDataFrames
In [106]:
df.replace('N/A',np.NaN)
Out[106]:
x y
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN
在上面的代码中,第一个参数可以是您想要更改的任意输入。
编辑了我之前的评论,因为有一个语法错误,这发生在我最近(01/04/2021)在这个平台上的这个加入中,你可以尝试用 NumPy 库替换函数,这将有助于加快进程。
df.replace('^^',np.NaN)或
df.replace('not filled in',np.NaN),
df.replace('&&', np.NaN),
df.replace('values needed', np.NaN),
df.replace('Na', np.NaN)
这是各种字符串替换
值取自我之前的评论和上面的问题陈述
输出[106]:
| X | 是的 | |
|---|---|---|
| 0 | 10 | 12 |
| 1 | 50 | 11 |
| 2 | 18 | 楠 |
| 3 | 32 | 13 |
| 4 | 47 | 15 |
| 5 | 20 | 楠 |