熊猫 groupby mean() 不忽略 NaN

新手上路,请多包涵

如果我计算一个 groupby 对象的平均值,并且在其中一个组中有一个 NaN(s),则 NaN 将被忽略。即使在应用 np.mean 时,它仍然只返回所有有效数字的平均值。我希望只要有一个 NaN 在组内,就会出现返回 NaN 的行为。这是行为的简化示例

import pandas as pd
import numpy as np
c = pd.DataFrame({'a':[1,np.nan,2,3],'b':[1,2,1,2]})
c.groupby('b').mean()
     a
b
1  1.5
2  3.0
c.groupby('b').agg(np.mean)
     a
b
1  1.5
2  3.0

我想收到以下结果:

      a
b
1  1.5
2  NaN

我知道我可以事先替换 NaN,并且我可能可以编写自己的聚合函数以在 NaN 位于组内时立即返回 NaN。但是这个功能不会被优化。

您是否知道使用优化函数实现所需行为的论点?

顺便说一句,我认为所需的行为是在以前版本的熊猫中实现的。

原文由 Tim Tee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

默认情况下, pandas 跳过 Nan 值。您可以通过指定 skipna=False 使其包含 Nan

 In [215]: c.groupby('b').agg({'a': lambda x: x.mean(skipna=False)})
Out[215]:
     a
b
1  1.5
2  NaN

原文由 Mayank Porwal 发布,翻译遵循 CC BY-SA 4.0 许可协议

mean(skipna=False) ,但它不起作用

GroupBy 聚合方法(min、max、mean、median 等)具有 skipna 参数,这是针对此确切任务的,但目前(2020 年 5 月)似乎存在 错误(issue于 2020 年 3 月开放),这会使其无法正常工作。

快速解决方法

基于此评论的完整工作示例: @Serge Ballesta@RoelAdriaans

 >>> import pandas as pd
>>> import numpy as np
>>> c = pd.DataFrame({'a':[1,np.nan,2,3],'b':[1,2,1,2]})
>>> c.fillna(np.inf).groupby('b').mean().replace(np.inf, np.nan)

     a
b
1  1.5
2  NaN

如需更多信息和更新,请点击上面的链接。

原文由 Dmitriy Work 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题