Python - 在保持列完整的同时删除异常值

时间:2017-03-14 15:02:46

标签: python numpy

我有一个看起来像这样的numpy数组: [[100, 1, 0.01, '5'], [50, 2, 0.02, '3'], [4000, 1, 0.01, '3']

我正在尝试做两件事:规范化3个第一列的数据,并删除3个第一列中具有异常值的行(以便保持第4列完整,作为字符串)。

我已经有了一个函数来规范我从这里获取的数据:Normalize numpy array columns in python

当我的一个数据是异常值时,我已经有了一个删除完整行的功能,我从这里取出:Removing outliers in each column (and corresponding row)

但是该函数正在规范所有列,我不希望它影响最后一列。所以我试着临时删除最后一列并以此方式将其放回去:

temp_col = np.take(a, [3], axis=1)
a = np.delete(a, [3], axis=1)
a = a.astype(np.float)
a = remove_outliers(a, 6)
a = normalize_data(a)
a = np.append(a, temp_col, axis=1) #wont work

这些是使用的方法(取自我上面提到的来源):

def normalize_data(a):
    return a / a.max(axis=0)

def remove_outliers(self, a, m):
    mask = np.ones((a.shape[0],), dtype=np.bool)
    mu, sigma = np.mean(a, axis=0), np.std(a, axis=0, ddof=1)
    for j in range(a.shape[1]):
        col = a[:, j]
        mask[mask] &= np.abs((col[mask] - mu[j]) / sigma[j]) < m
    return a[mask]

但现在的问题是,当我删除异常值行时,我的临时列的长度不再与数组大小匹配,所以我无法追回它。

有没有人能解决这个问题?我应该这么做,并保存因异常值而删除的行的索引,然后在temp_col中将其删除?

非常感谢!

0 个答案:

没有答案