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

Python—在保持列完整性的同时删除异常值,python,numpy,Python,Numpy,我有一个numpy数组,看起来像这样: [[100,1,0.01,5'],[50,2,0.02,3'],[4000,1,0.01,3'] 我试着做两件事:规范化前3列的数据,删除前3列中存在异常值的行(以便保持第4列作为字符串的完整性) 我已经有了一个函数来规范化从这里获取的数据: 我已经有了一个函数,当其中一个数据是异常值时,可以删除完整的行,我从这里得到: 但是函数正在规范化所有列,我不希望它影响最后一列。因此我尝试临时删除最后一列并将其放回原处: temp_col = np.take(a,

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

我试着做两件事:规范化前3列的数据,删除前3列中存在异常值的行(以便保持第4列作为字符串的完整性)

我已经有了一个函数来规范化从这里获取的数据:

我已经有了一个函数,当其中一个数据是异常值时,可以删除完整的行,我从这里得到:

但是函数正在规范化所有列,我不希望它影响最后一列。因此我尝试临时删除最后一列并将其放回原处:

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标准化_数据(a):
返回a/a.max(轴=0)
def删除_异常值(自我、a、m):
mask=np.one((a.shape[0],),dtype=np.bool)
mu,sigma=np.平均值(a,轴=0),np.标准值(a,轴=0,ddof=1)
对于范围内的j(a.形状[1]):
col=a[:,j]
掩码[mask]&=np.abs((列[mask]-mu[j])/sigma[j])
但现在的问题是,当我删除离群值行时,我的临时列的长度不再与数组大小匹配,因此我无法将其追加回去

有人有解决这个问题的方法吗?我是不是应该这样做,并保存由于异常值而被删除的行的索引,然后在我的临时列中删除它


非常感谢!

首先删除异常值,然后创建临时列,然后进行规格化,然后再重新添加临时列?有什么问题吗?您能发布规格化和删除异常值的代码吗?您认为在那里添加“跳过列”功能最简单。另一个选项是使用熊猫,我们可以在某些索引上进行匹配。@avysk问题是我不希望remove_outliers删除基于第四列的行,而且如果其中有字符串,我使用的方法也不起作用。@Roelant我更新了问题,并添加了infoMake
remove_outliers()
return
mask
,而不是
a[mask]
。然后使用该掩码同样地修改
a
temp\u col
a=a[mask];temp\u col=temp\u col[mask]
。然后我认为
np.append()
应该可以工作。
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]