Pandas中groupby.sum()处理inf值返回NaN而非inf的原因咨询
问题:Pandas分组聚合sum返回NaN而非inf的原因
我有如下Pandas DataFrame:
其中p_nom_max列包含inf值:
>>> df["p_nom_max"] == np.inf Generator DE0 1 nuclear True DE0 2 nuclear True DE0 3 nuclear False Name: p_nom_max, dtype: bool
直接对该列使用.sum()聚合时,结果符合预期为inf:
>>> df["p_nom_max"].sum() inf
但按"carrier"分组后对p_nom_max列聚合时,标准sum函数返回NaN值,仅用lambda包装的np.sum能得到正确结果:
>>> df.groupby("carrier").agg({"p_nom_max": ["sum", np.sum, lambda x: np.sum(x)]}) p_nom_max sum sum <lambda_0> carrier nuclear NaN NaN inf
请问为何标准groupby聚合会返回NaN而非inf?
原因解析
这是因为Pandas分组聚合的sum(原生pandas.core.groupby.SeriesGroupBy.sum)和直接调用Series的sum、np.sum的处理逻辑存在差异:
- Pandas分组的
sum默认开启skipna=True,如果分组内同时存在inf和NaN,它会优先返回NaN;而直接调用df["p_nom_max"].sum()时,若数据中NaN不影响inf的优先级,会直接返回inf。 np.sum的逻辑更直接:只要输入中存在inf,不管有没有NaN,聚合结果都是inf;用lambda包装np.sum相当于绕开了Pandas分组聚合的默认处理,直接使用NumPy的计算规则。
你可以通过设置skipna=False验证这个逻辑:
df.groupby("carrier").agg({"p_nom_max": lambda x: x.sum(skipna=False)})
此时Pandas的sum会保留inf结果,不再返回NaN。
内容的提问来源于stack exchange,提问作者euronion
相关产品推荐
相关产品推荐

