【问题标题】:Drop rows based on one column values根据一列值删除行
【发布时间】:2019-02-24 03:26:52
【问题描述】:

我有一个如下所示的数据框:

        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())]

但我想删除整个行。

我该怎么做?

【问题讨论】:

  • 您的代码应该可以工作。怎么了?

标签: python-2.7 pandas dataframe outliers


【解决方案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()) &lt;= (df['mad'].std())] 的输出,如上所示。操作未到位。

【讨论】:

  • 是的,我可以看到,但没有行。 2,3,6 还在。与这些行中的其他值相比,coumn 'mad' 的值仍然很大。
  • @GyanenderGandhar 是的,但它们仍在一个标准偏差之内。你想在这里做什么?你真正想删除什么?您必须定义“非常大”的含义,我们无法猜测这意味着什么。请注意,您的代码 确实 删除了整行,只是在您的示例中不满足谓词。我认为这就是问题所在。
  • @GyanenderGandhar 我应该说,它们的差异在列的标准偏差内。您是否只想删除第一个标准偏差之外的所有项目?如果您改为使用df['mad'] &lt;= df['mad'].std(),则会删除更多项目。
  • 是的,你明白了。我使用了这个 "df['mad']
  • 你使用了我上面的代码吗?您可能没有重新分配df[df['mad'] &lt;= df['mad'].std() 的输出。你必须做类似new_df = df[df['mad'] &lt;= df['mad'].std() 的事情。操作没有到位,df没有修改(上面回答中也提到了)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2019-07-06
    • 2021-04-21
    相关资源
    最近更新 更多