You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:14:51