Pandas groupby mean() 不忽略 NaN

Tim*_*Tee 4 python nan dataframe pandas

如果我计算 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
Run Code Online (Sandbox Code Playgroud)

我想收到以下结果:

     a
b     
1  1.5
2  NaN
Run Code Online (Sandbox Code Playgroud)

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

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

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

May*_*wal 10

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

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


Dmi*_*ork 6

mean(skipna=False),但是没用

GroupBy 聚合方法(最小值、最大值、平均值、中值等)具有skipna用于此确切任务的参数,但目前(2020 年 5 月)似乎存在错误(问题于 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
Run Code Online (Sandbox Code Playgroud)

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