【问题标题】:Group by median for Numpy (without Pandas)Numpy 按中位数分组(没有 Pandas)
【发布时间】:2020-12-02 06:33:36
【问题描述】:

是否可以在不使用 pandas(并将我的数据保存在 Numpy 数组中)的情况下根据另一列的分组计算一列的中位数?

例如,如果这是输入:

arr = np.array([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]])

我想要这个作为输出(使用第一列进行分组,然后取第二列的中位数:

ans = np.array([[0,2],[1,5]])

【问题讨论】:

    标签: python numpy group-by median


    【解决方案1】:

    如果您出于某种原因想要避免使用 Pandas,这里有一种可能进行该计算。请注意,在一般情况下,中位数不是整数值(除非您将其舍入或取整),因为对于偶数组,它将是两个最中间元素的平均值,因此您不能同时拥有整数组单个常规数组中的 id 和中值(尽管您可以在结构化数组中)。

    import numpy as np
    
    def grouped_median(group, value):
        # Sort by group and value
        s = np.lexsort([value, group])
        arr2 = arr[s]
        group2 = group[s]
        value2 = value[s]
        # Look for group boundaries
        w = np.flatnonzero(np.diff(group2, prepend=group2[0] - 1, append=group2[-1] + 1))
        # Size of each group
        wd = np.diff(w)
        # Mid points of each group
        m1 = w[:-1] + wd // 2
        m2 = m1 - 1 + (wd % 2)
        # Group id
        group_res = group2[m1]
        # Group median value
        value_res = (value2[m1] + value2[m2]) / 2  # Use `// 2` or round for int result
        return group_res, value_res
    
    # Test
    arr = np.array([[0, 1], [0, 2], [0, 3], [1, 4], [1, 5], [1, 6]])
    group_res, value_res = grouped_median(arr[:, 0], arr[:, 1])
    # Print
    for g, v in zip(group_res, value_res):
        print(g, v)
        # 0 2.0
        # 1 5.0
    # As a structured array
    res = np.empty(group_res.shape, dtype=[('group', group_res.dtype),
                                           ('median', value_res.dtype)])
    res['group'] = group_res
    res['median'] = value_res
    print(res)
    # [(0, 2.) (1, 5.)]
    

    【讨论】:

    • @lara_toff。这是非常有效的。将其粘贴到某个函数中,然后忘记实现。
    • 我会把w = np.where(group[:-1] != group[1:])[0]写成w = np.flatnonzero(np.diff(group, prepend=group[0] - 1, append=group[-1] + 1))。然后下一行也消失了
    • @MadPhysicist 谢谢,总是忘记np.diff 中的prependappend,太方便了。
    • @jdehesa。它们相对较新。它们肯定很方便。
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2019-08-05
    • 2020-10-07
    相关资源
    最近更新 更多