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

A median that doesn't divide the sum of two elements in cases when there is an even number of elements

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

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

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

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

看起来 median() 方法中没有参数使它 select 成为两个最近的元素之一而不是相除,我找不到 [=11= 的替代方法] 方法也可以做到这一点。实现我自己的中值函数是我唯一的选择吗?

您应该使用分位数选项(默认为中位数,即 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

如果你不需要使用pandas,你可以简单地对列表进行排序,然后获取中间的元素。使用整数除法来确保你得到一个没有小数的实际索引。

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 是这两个索引中的第一个。