有没有办法用 NaN 替换现有值

数据挖掘 机器学习 Python 数据清理 数据
2022-02-27 12:11:04

我正在尝试 iPython Notebooks 中的算法,并想知道我是否可以在随机位置用 Nan(大约 50% 或更多)替换数据集中的现有值,每列具有不同比例的 Nan 值。

我正在使用 Iris 数据集进行此实验,以了解算法的工作原理以及哪个算法效果最好。数据集的链接在这里

在此先感谢您的帮助。

3个回答

随机替换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

任何数组维度的 Dropout

使用超过 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