去除最小值、最大值并计算平均值

4

我有一列数字,需要移除其中一个最小值和一个最大值,然后计算剩下数字的平均值。问题在于最小值/最大值可能出现在列中的任何位置,某些行可能为空(null)或为零,或者该列可能仅包含3个值。所有数字的取值范围为0到100。

Value    Property
80          H
30.5        D
40          A
30.5        A
72          H
56          D
64.2        H

如果有多个最小值或最大值,只能删除一个。

计算列的最小值和最大值,我按以下方法进行:

maximum = df['Value'].max()
minimum = df['Value'].min()

在计算这个平均值的条件中,我还包括了非空且不等于零的条件。但是,我不知道如何仅删除一个最大值和一个最小值,并添加关于大于3行/值的信息。
希望你能提供一些帮助/提示。
3个回答

2
如果目标是在不考虑最大值和最小值的情况下计算平均值,您可以这样做:
(df['Value'].sum() - df['Value'].min() - df['Value'].max())/(len(df)-2)

该输出52.54是您的数据。请注意,这将忽略NaN等情况。这不会修改您的df,如果我正确理解问题的话,这也不是目标。


1

让我们做 idxminidxmax

out = df.drop([df.Value.idxmax(),df.Value.idxmin()])
Out[27]: 
   Value Property
2   40.0        A
3   30.5        A
4   72.0        H
5   56.0        D
6   64.2        H

0
最近我遇到了一个类似的问题。最终我发现了numpy.ma库,并发现这是一个优雅的解决方案。
import numpy.ma as ma
df['Value'].values

# output -> array([80. , 30.5, 40. , 30.5, 72. , 56. , 64.2])

col_name= 'Value'
ma.masked_outside(df[col_name].values, df[col_name].min()+0.02, df[col_name].max()-0.05)

# output -> masked_array(data=[--, --, 40.0, --, 72.0, 56.0, 64.2],
#             mask=[ True,  True, False,  True, False, False, False],
#       fill_value=1e+20

# mean for values without outliers
ma.masked_outside(df[col_name].values, df[col_name].min()+0.02, df[col_name].max()-0.05).mean()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接