Python 如何删除顶部和底部第n%的数据

Python 如何删除顶部和底部第n%的数据,python,numpy,Python,Numpy,我正在创建一个函数来计算修剪后的平均值。为此,我删除了数据的最高和最低百分比,然后像往常一样计算平均值。到目前为止,我得到的是: def trimmed_mean(data, percent): from numpy import percentile if percent < 50: data_trimmed = [i for i in data if i > percentile(data, per

我正在创建一个函数来计算修剪后的平均值。为此,我删除了数据的最高和最低百分比,然后像往常一样计算平均值。到目前为止,我得到的是:

def trimmed_mean(data, percent):
    from numpy import percentile

    if percent < 50:
        data_trimmed = [i for i in data
                        if i > percentile(data, percent)
                        and i < percentile(data, 100-percent)]
    else:
        data_trimmed = [i for i in data
                        if i < percentile(data, percent)
                        and i > percentile(data, 100-percent)]

    return sum(data_trimmed) / float(len(data_trimmed))
def-trimmed_平均值(数据,百分比):
从numpy导入百分比
如果百分比<50:
数据_trimmed=[i代表数据中的i
如果i>百分位(数据,百分比)
和i<百分位数(数据,100%)
其他:
数据_trimmed=[i代表数据中的i
如果i<百分位(数据,百分比)
和i>百分位数(数据,100%)
返回和(数据修剪)/浮动(长度(数据修剪))
但我确实得到了错误的结果。所以,对于
[37,33,33,32,29,28,28,23,22,22,21,21,20,20,19,19,18,18,16,15,14,14,14,12,12,9,6]
来说,10%的平均值应该是
20.16
,而我得到
20.0

在python中,有没有其他方法可以删除顶部和底部数据?
还是我做错了什么

我建议先对数组进行排序,然后在中间取一个“切片”

在这里:


你可以看看这个相关的问题:

简而言之,对于scipy version>0.14.0,以下内容完成了这项工作

from scipy import stats
m = stats.trim_mean(X, percentage)
如果您不想依赖外部库,那么您当然可以恢复到其答案中所示的方法。

也许这会奏效:

data = [37, 33, 33, 32, 29, 28, 28, 23, 22, 22, 22, 21, 21, 21, 20, 20, 19, 19, 18, 18, 18, 18, 16, 15, 14, 14, 14, 12, 12, 9, 6]
percent = .1 # == 10%

def trimmed_mean(data, percent):
    # sort list
    data = sorted(data)
    # number of elements to remove from both ends of list
    g = int(percent * len(data))
    # remove elements
    data = data[g:-g]
    # cast sum to float to avoid implicit casting to int
    return float(sum(data)) / len(data)

print trimmed_mean(data, percent)
输出:

$ python trimmed_mean.py 
20.16

@Аааааааааааааааааааааааа,也许没有必要感谢编辑您的[32,29,28,28,23,22,22,22,21,21,21,20,19,18,18,18,18,16,15,14,14,12]应该包含在数据中吗?百分位(数据,10)=12。是的,应该有12。如果楼层划分异常值=n*percent//100,效果很好。谢谢!
data = [37, 33, 33, 32, 29, 28, 28, 23, 22, 22, 22, 21, 21, 21, 20, 20, 19, 19, 18, 18, 18, 18, 16, 15, 14, 14, 14, 12, 12, 9, 6]
percent = .1 # == 10%

def trimmed_mean(data, percent):
    # sort list
    data = sorted(data)
    # number of elements to remove from both ends of list
    g = int(percent * len(data))
    # remove elements
    data = data[g:-g]
    # cast sum to float to avoid implicit casting to int
    return float(sum(data)) / len(data)

print trimmed_mean(data, percent)
$ python trimmed_mean.py 
20.16