如何使用.agg方法计算pandas中的列平均值

问题描述 投票:3回答:1

我明白.agg可以很容易地用于计算平均值。例如,如果我有一个数据框df:

df
       one  two  three
   A    1    2      3
   B    4    5      6
   C    7    8      9

我想计算每列的平均值,我可以简单地这样做:

df.agg(np.average)
    one      4.0
    two      5.0
    three    6.0
    dtype: float64

现在,让我们说我只对“一个”的平均值感兴趣。直观地说,我这样写,我期待一个数字4:

df.agg({'one':np.average})   #or df['one'].agg(np.average)

但是,它返回第一列而不是4,而不是4:

       one
    A  1.0
    B  4.0
    C  7.0

为什么?

python pandas dataframe
1个回答
2
投票

有很多方法可以做到这一点,而你似乎偶然发现了无效的唯一方法。这些都适合我:

df["one"].agg("mean")

df.agg({"one": "mean"})

df["one"].agg(np.mean)

df.agg({"one": np.mean})

看一下源代码,看来当你使用average时,它将DataFrame转换为numpy array,然后mean默认采用行方式平均值。因为在基本情况下(没有重量)average实际上称为mean

看到

def mean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):

    kwargs = {}
    if keepdims is not np._NoValue:
        kwargs['keepdims'] = keepdims
    if type(a) is not mu.ndarray:
        try:
            mean = a.mean
        except AttributeError:
            pass
        else:
            return mean(axis=axis, dtype=dtype, out=out, **kwargs)

    return _methods._mean(a, axis=axis, dtype=dtype,
                      out=out, **kwargs)

def average(a, axis=None, weights=None, returned=False):

    if (type(a) not in (np.ndarray, np.matrix) and
            issubclass(type(a), np.ndarray)):
        warnings.warn("np.average currently does not preserve subclasses, but "
                      "will do so in the future to match the behavior of most "
                      "other numpy functions such as np.mean. In particular, "
                      "this means calls which returned a scalar may return a "
                      "0-d subclass object instead.",
                      FutureWarning, stacklevel=2)

    if not isinstance(a, np.matrix):
        a = np.asarray(a)

    if weights is None:
        avg = a.mean(axis)
        scl = avg.dtype.type(a.size/avg.size)
    else:
        ...
© www.soinside.com 2019 - 2024. All rights reserved.