Pandas与Polars的mean()函数计算差异原因咨询
Pandas与Polars分组均值计算差异问题
Pandas实现
import pandas as pd pd.DataFrame({ 'id': ['A', 'A', 'B', 'B', 'B', 'B'], 'a': [1, 2, 3, 4, float('inf'), float('inf')] }).groupby('id').mean()
执行结果:
a id A 1.5 B NaN
Polars实现
import polars as pl pl.DataFrame({ 'id': ['A', 'A', 'B', 'B', 'B', 'B'], 'a': [1., 2., 3., 4., float('inf'), float('inf')] }).group_by('id').mean()
执行结果:
┌─────┬─────┐ │ id ┆ a │ │ --- ┆ --- │ │ str ┆ f64 │ ╞═════╪═════╡ │ B ┆ inf │ │ A ┆ 1.5 │ └─────┴─────┘
可见,Pandas中ID为"B"的分组均值结果为NaN,而Polars中相同分组的均值结果为inf。请问二者计算方式不同的原因是什么?背后遵循的原理是什么?如何在Pandas中复现Polars的计算结果?
问题解答
差异原因与底层原理
- Pandas计算逻辑:Pandas的
mean()方法默认采用保守的数值处理策略,遵循IEEE 754标准中NaN传播的隐含规则。在计算均值时,Pandas会先调用sum()方法,而该方法在遇到inf与有限值混合的情况时,会返回NaN——这是因为Pandas默认将这种混合运算视为无效场景,避免返回可能误导的inf结果。最终均值计算基于这个NaN的求和结果,自然得到NaN。 - Polars计算逻辑:Polars严格遵循纯数学层面的无穷大运算规则,
inf与任何有限值的和仍为inf,将该结果除以分组的样本数量(有限值)后,结果依然是inf。Polars默认不把inf当作缺失值处理,而是保留其数学含义参与计算,因此分组B的均值为inf。
在Pandas中复现Polars的结果
要得到和Polars一致的inf结果,需要绕过Pandas默认的求和逻辑,手动实现均值计算:
import pandas as pd df = pd.DataFrame({ 'id': ['A', 'A', 'B', 'B', 'B', 'B'], 'a': [1, 2, 3, 4, float('inf'), float('inf')] }) # 手动计算:保留inf的求和结果后除以分组大小 result = df.groupby('id')['a'].agg(lambda x: x.sum(skipna=False) / len(x)) print(result)
执行结果:
id A 1.5 B inf Name: a, dtype: float64
核心是使用x.sum(skipna=False),该参数会强制保留inf的求和结果(3+4+inf+inf = inf),再除以分组的样本数量4,最终得到inf。
内容的提问来源于stack exchange,提问作者Krows
相关产品推荐
相关产品推荐

