根据一列值删除行

时间:2018-09-19 21:45:00

标签: python-2.7 pandas dataframe outliers

我有一个看起来像这样的数据框:

        wave       mean    median        mad
0    4050.32  -0.016182 -0.011940   0.008885
1    4208.98   0.023707  0.007189   0.032585
2    4508.28   3.662293  0.001414   7.193139
3    4531.62 -15.459313 -0.001523  30.408377
4    4551.65   0.009028  0.007581   0.005247
5    4554.46   0.001861  0.010692   0.027969
6    6828.60 -10.604568 -0.000590  21.084799
7    6839.84  -0.003466 -0.001870   0.010169
8    6842.04 -32.751551 -0.002514  65.118329
9    6842.69  18.293519 -0.002158  36.385884
10   6843.66   0.006386 -0.002468   0.034995
11   6855.72   0.020803  0.000886   0.040529

从上表中可以明显看出,列madmedian中的某些值非常大(异常值)。所以我想删除具有这些很大值的行。

例如,在row3中,mad的值是30.408377,该值非常大,因此我想删除此行。我知道我可以用一行 从列中删除这些值,但不会删除完整的行

df[np.abs(df.mad-df.mad.mean()) <= (3*df.mad.std())]

但是我想删除完整的行。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

像您给定的这样的谓词将删除整个行。但是您的数据均未超出3个标准差。如果将其调低至仅一个标准偏差,则示例数据将删除行。

以下是使用您的数据的示例:

import pandas as pd
import numpy as np

columns = ["wave", "mean", "median", "mad"]
data = [
    [4050.32, -0.016182, -0.011940, 0.008885],
    [4208.98, 0.023707, 0.007189, 0.032585],
    [4508.28, 3.662293, 0.001414, 7.193139],
    [4531.62, -15.459313, -0.001523, 30.408377],
    [4551.65, 0.009028, 0.007581, 0.005247],
    [4554.46, 0.001861, 0.010692, 0.027969],
    [6828.60, -10.604568, -0.000590, 21.084799],
    [6839.84, -0.003466, -0.001870, 0.010169],
    [6842.04, -32.751551, -0.002514, 65.118329],
    [6842.69, 18.293519, -0.002158, 36.385884],
    [6843.66, 0.006386, -0.002468, 0.034995],
    [6855.72, 0.020803, 0.000886, 0.040529],
]

df = pd.DataFrame(np.array(data), columns=columns)
print("ORIGINAL: ")
print(df)

print()

res = df[np.abs(df['mad']-df['mad'].mean()) <= (df['mad'].std())]
print("REMOVED: ")
print(res)

此输出:

ORIGINAL:
       wave       mean    median        mad
0   4050.32  -0.016182 -0.011940   0.008885
1   4208.98   0.023707  0.007189   0.032585
2   4508.28   3.662293  0.001414   7.193139
3   4531.62 -15.459313 -0.001523  30.408377
4   4551.65   0.009028  0.007581   0.005247
5   4554.46   0.001861  0.010692   0.027969
6   6828.60 -10.604568 -0.000590  21.084799
7   6839.84  -0.003466 -0.001870   0.010169
8   6842.04 -32.751551 -0.002514  65.118329
9   6842.69  18.293519 -0.002158  36.385884
10  6843.66   0.006386 -0.002468   0.034995
11  6855.72   0.020803  0.000886   0.040529

REMOVED:
       wave       mean    median        mad
0   4050.32  -0.016182 -0.011940   0.008885
1   4208.98   0.023707  0.007189   0.032585
2   4508.28   3.662293  0.001414   7.193139
3   4531.62 -15.459313 -0.001523  30.408377
4   4551.65   0.009028  0.007581   0.005247
5   4554.46   0.001861  0.010692   0.027969
6   6828.60 -10.604568 -0.000590  21.084799
7   6839.84  -0.003466 -0.001870   0.010169
10  6843.66   0.006386 -0.002468   0.034995
11  6855.72   0.020803  0.000886   0.040529

观察索引为89的行现在消失了。

请确保如上所述,重新分配df[np.abs(df['mad']-df['mad'].mean()) <= (df['mad'].std())]的输出。该操作未完成。

答案 1 :(得分:0)

执行df[np.abs(df.mad-df.mad.mean()) <= (3*df.mad.std())]不会更改数据框。 但是将其分配回df,以便:

df = df[np.abs(df.mad-df.mad.mean()) <= (3*df.mad.std())]