首页 > 解决方案 > 从坐标列表中删除异常值

问题描述

我有 2 个列表Xy十个坐标值。

我还有 2 个额外的点异常值列表:outlier_x 和 outlier_y。

我想检查我的 X 和 Y 列表,将它们的坐标与异常值进行比较,并创建新的 2 个列表(X_new 和 y_new),其中将包括没有异常值的点。

我堆叠的地方有我的嵌套循环。它只记录第一个点,sims 不会移动到下一个点。你能帮忙修一下吗?

X = dataset.iloc[:, 1].values
X = X.reshape(len(X),1)
y = dataset.iloc[:, 2].values

X_new = []
y_new = []
i = 0
n = 0
while i < len(X):
    while n < len(outlier_x):
        if (X[i] == outlier_x[n] and y[i] == outlier_y[n]):
            continue
        X_new.append(X[i])
        y_new.append(y[i])
        n+=
    i+=1

这是我的数据集:

      x          y
0   0.0   0.998440
1   1.0   2.188544
2   4.0   7.572174
3   7.0   6.138442
4  11.0  11.737930
5   0.0   1.043314
6   1.0   1.733181
7   4.0   7.424136
8   7.0   6.138442
9  11.0   9.737930

而这些点,之前已被确定为异常值:

      x          y
0   4.0   7.572174
1   7.0   6.138442
2  11.0  11.737930
3   4.0   7.424136
4   7.0   6.138442

标签: pythonpandasnumpy

解决方案


解决方案

data[~np.isin(data, outliers).all(axis=1)]

脚步

从这两个 DataFrame 开始:

In [3]: data
Out[3]:
      x          y
0   0.0   0.998440
1   1.0   2.188544
2   4.0   7.572174
3   7.0   6.138442
4  11.0  11.737930
5   0.0   1.043314
6   1.0   1.733181
7   4.0   7.424136
8   7.0   6.138442
9  11.0   9.737930

In [4]: outliers
Out[4]:
      x          y
0   4.0   7.572174
1   7.0   6.138442
2  11.0  11.737930
3   4.0   7.424136
4   7.0   6.138442

我们可以使用该np.isin()函数检查 in 中的任何行data是否具有与 in 中的任何行匹配的任何值outliers

In [5]: np.isin(data, outliers)
Out[5]:
array([[False, False],
       [False, False],
       [ True,  True],
       [ True,  True],
       [ True,  True],
       [False, False],
       [False, False],
       [ True,  True],
       [ True,  True],
       [ True, False]])

由于我们想要完全匹配(x 和 y 坐标),all()因此沿第一个轴(跨列)使用:

In [6]: np.isin(data, outliers).all(axis=1)
Out[6]:
array([False, False,  True,  True,  True, False, False,  True,  True,
       False])

这个布尔掩码告诉我们哪些行与异常值完全匹配。我们需要做的就是反转掩码(因为我们要过滤异常值),并data使用该掩码进行索引:

In [7]: data[~np.isin(data, outliers).all(axis=1)]
Out[7]:
      x         y
0   0.0  0.998440
1   1.0  2.188544
5   0.0  1.043314
6   1.0  1.733181
9  11.0  9.737930

x从那里,您可以对和y列做任何您喜欢的事情。

替代解决方案,从一维数组开始

如果您有单独的一维数组Xy,并且对于异常值也是如此,您可以将它们压缩成元组并将它们添加到一个集合中,然后从集合中减去异常值:

points = set(zip(X, y))
outliers = set(zip(outlier_x, outlier_y))
X_new, y_new = zip(*(points - outliers))

推荐阅读