Pandas 与 Polars:mean() 函数

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

有计算列平均值的代码

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 来说,我们得到了

pl.DataFrame({'id': ['A', 'A', 'B', 'B', 'B', 'B'], 'a': [1, 2, 3, 4, float('inf'), float('inf')]}).groupby('id').mean()

┌─────┬─────┐
│ id  ┆ a   │
│ --- ┆ --- │
│ str ┆ f64 │
╞═════╪═════╡
│ B   ┆ inf │
│ A   ┆ 1.5 │
└─────┴─────┘

在第一个示例中,我们有 ID“B”的

NaN
值,但对于第二个示例中的相同 ID,我们有
inf

为什么以及基于什么原则它们的计算方式不同?

我尝试在 Pandas 上重现 Polars 示例,但在数据帧中遇到了不同的结果。

python pandas dataframe python-polars
1个回答
0
投票

pandas
计算平均值时,如果一个组包含
float('inf')
和有限值,则会产生
nan
表示结果未定义,而在计算
polars
中的平均值时,如果一个组仅包含
float('inf') 
值,结果为
inf
。如果有有限值与
inf
混合,则会产生
nan
。如果您想在
pandas
中重现极坐标的行为,您可以这样做:

import pandas as pd
import numpy as np

def custom_mean(series):
    if np.all(np.isinf(series)):
        return float('inf')
    else:
        return series.mean()

df = pd.DataFrame({'id': ['A', 'A', 'B', 'B', 'B', 'B'], 'a': [1, 2, 3, 4, float('inf'), float('inf')]})
result = df.groupby('id').agg({'a': custom_mean})
print(result)

这给出了

      a
id     
A   1.5
B   inf
© www.soinside.com 2019 - 2024. All rights reserved.