如果在IQR之外,则删除列表中的项目

时间:2014-12-11 21:23:51

标签: python numpy

如果项目位于距离中位数的四分位数范围之外,我试图从列表中删除该项目。

以下是清单:

l = [69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 87, 89]

IQR,中位数以及中位数以上和以下与import numpy as np

一起使用
iqr = np.subtract(*np.percentile(l, [75, 25]))
median = np.percentile(l, 50)
minus = median - iqr
plus = median + iqr

负数为69,加号为71(使用IQR高于和低于中位数)

但是,当遍历列表并尝试删除iqr上方/下方的项目(87,89)时。它们不会从列表中删除。

for i in l:
    if i < minus:
        del i
    if i > plus:
        del i

当我打印列表时,它仍然显示87,89。

3 个答案:

答案 0 :(得分:1)

for  ele in l[:]:
    if ele < minus or ele > plus:
        l.remove(ele)

您必须复制l l[:]并使用l.remove

改变实际列表本身

答案 1 :(得分:1)

del不是您正在寻找的运营商。它用于删除对象的引用,因此在垃圾收集中很有用。

你可能正在寻找这个:

import numpy as np
l = [69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 87, 89]
iqr = np.subtract(*np.percentile(l, [75, 25]))
median = np.percentile(l, 50)
minus = median - iqr
plus = median + iqr

arr = np.array(l)
arr[ (minus < arr) & (arr < plus)]

答案 2 :(得分:1)

只需将其转换为numpy数组,然后从那里转换数学:

l = np.array(l)
l[(l >= 69) & (l <= 71)]

是的。