有计算列平均值的代码
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 示例,但在数据帧中遇到了不同的结果。
用
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