为何pandas.Series.apply结合np.sum无法作用于整个Series?
Series.apply结合np.sum无法实现聚合的原因
先看示例DataFrame:
>>> df a b 0 aaa 22.0 1 bb 33.0 2 4 44.0 3 6 11.0
想要对列b求和,已知np.sum(df['b'])可以得到正确结果,但以下两种apply写法无法实现求和:
>>> df['b'].apply(np.sum, axis=0) 0 22.0 1 33.0 2 44.0 3 11.0 Name: b, dtype: float64 >>> df['b'].apply(np.sum) 0 22.0 1 33.0 2 44.0 3 11.0 Name: b, dtype: float64
为什么apply函数结合np.sum无法作用于整个Series?
pandas文档中对Series.apply的描述是:
Invoke function on values of Series.
Can be ufunc (a NumPy function that applies to the entire Series) or a Python function that only works on single values.
这里的描述容易产生误解——NumPy函数在apply中并非直接作用于整个Series,而是逐个作用于每个单元格。
具体原因:
Series.apply的核心逻辑是遍历Series的每一个元素,将函数分别应用到单个元素上,再把结果组合成新的Series返回。np.sum虽然是能处理数组的ufunc,但当它接收单个数值(比如22.0)作为输入时,会直接返回该数值本身。所以用apply调用np.sum时,本质是给每个元素单独执行np.sum(22.0)、np.sum(33.0),结果自然就是原元素的原样输出,无法实现整个Series的聚合求和。
总结:
如果要对Series做聚合求和,直接使用df['b'].sum()或者np.sum(df['b'])即可;apply的设计初衷是处理逐元素的自定义操作,而非全局聚合。
内容的提问来源于stack exchange,提问作者CyberPlayerOne
相关产品推荐
相关产品推荐

