Pandas Groupby计算均值时,如何遇NaN即返回NaN而非忽略?
解决Pandas Groupby均值计算时保留NaN的问题
你提的这个需求很常见——默认情况下Pandas的groupby.mean()和agg(np.mean)都会自动忽略分组内的NaN值,但有时候我们需要只要分组中存在缺失值,就返回NaN的严格计算逻辑,而且希望用高效的内置方法,避免自定义函数的性能损耗。
核心解决方案:使用skipna=False参数
其实Pandas的mean()方法本身就提供了skipna参数,默认值是True(忽略NaN),只要把它改成False,就能实现你想要的效果:
import pandas as pd import numpy as np c = pd.DataFrame({'a':[1,np.nan,2,3],'b':[1,2,1,2]}) # 使用skipna=False参数开启严格均值计算 result = c.groupby('b').mean(skipna=False) print(result)
执行后得到的结果完全符合你的预期:
a b 1 1.5 2 NaN
关于agg(np.mean)的说明
你提到用agg(np.mean)得到了和默认mean()一样的结果,这是因为当你在agg()中传入np.mean时,Pandas会对每个分组的Series调用np.mean(),而np.mean()处理Pandas Series时,会沿用Series默认的skipna=True逻辑。如果要通过agg()实现同样的效果,可以用lambda调用带参数的mean():
result = c.groupby('b').agg(lambda x: x.mean(skipna=False))
不过这种方式的性能不如直接使用groupby.mean(skipna=False),因为lambda会引入额外的Python层开销,而前者是完全优化过的Cython内置实现,效率更高。
关于旧版Pandas的记忆
你提到旧版Pandas似乎支持该行为,可能是混淆了不同函数的默认逻辑:比如早期版本中np.mean处理纯numpy数组时,遇到NaN会直接返回NaN,但Pandas的mean()方法一直默认skipna=True。不过现在通过skipna=False参数,就能轻松实现你需要的严格均值计算。
内容的提问来源于stack exchange,提问作者Tim Tee
相关产品推荐
相关产品推荐

