在元素数量为偶数的情况下不除以两个元素之和的中位数



尝试搜索,它没有找到任何相关的内容。假设我们有一个偶数个数的序列,我们想计算它的中位数:

pd.Series([4, 6, 8, 10]).median()

由于我们有偶数个元素,因此没有元素正好位于中间,因此该方法执行计算:(6 + 8(/2 = 7。但是,就我而言,中位数是系列中已经存在的数字非常重要,它不能从头开始计算。所以我宁愿选择 6 或 8 而不是使用 7。

可能的解决方案之一是检测存在偶数个元素的事实,在这种情况下,添加另一个保证最大或最小的元素,然后在我获得中位数后将其删除。但是,即使对于一个系列的情况,这种解决方案似乎也相当笨拙。如果我们处理的是 SeriesGroupBy 对象,其中必须为每个组分别计算这样的中位数,我什至无法想象如何实现它。

看起来median()方法中没有参数可以使其选择两个最近的元素之一而不是除法,我也找不到任何可以做到这一点的方法median()替代方案。实现我自己的中位数函数是我唯一的选择吗?

与其使用中位数,不如使用分位数选项(默认值为中位数,即 0.5 分位数(,并将插值设置为更高、更低或最接近。

例如

>>> pd.Series([4, 6, 8, 10]).quantile(q=0.5, interpolation='nearest')
8
>>> pd.Series([4, 6, 8, 10]).quantile(q=0.5, interpolation='higher')
8
>>> pd.Series([4, 6, 8, 10]).quantile(q=0.5, interpolation='lower')
6

如果你不需要使用熊猫,你可以通过简单地对列表进行排序,然后获取中间元素来完成。使用整数除法来确保获得没有分数的实际索引。

def list_median(l):
if len(l) == 0:
return None # or maybe raise an error
return sorted(l)[(len(l) - 1) // 2]

例子:

如果列表长度为7(奇数(,则媒体为索引 3,(len(l) - 1) // 2) == 3

如果列表长度为8(偶数(,则中位数介于索引 3 和 4 之间,(len(l) - 1) // 2) == 3是这两个索引中的第一个。

最新更新