熊猫聚合忽略了NaN的

Zhu*_*arb 9 python numpy aggregate nan pandas

我汇总了我的Pandas数据帧:data.具体来说,我希望amount通过[ origintype]的元组得到平均值和总和.为了平均和求和,我尝试了下面的numpy函数:

import numpy as np
import pandas as pd
result = data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum, pd.Series.mean]}).reset_index() 
Run Code Online (Sandbox Code Playgroud)

我的问题是该amount列包含NaNs,这导致result上述代码具有大量的NaN平均值和总和.

我知道这两个pd.Series.sumpd.Series.mean具有skipna=True默认情况下,所以为什么我仍然得到NaN下面就?

我也试过这个,这显然不起作用:

data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum(skipna=True), pd.Series.mean(skipna=True)]}).reset_index() 
Run Code Online (Sandbox Code Playgroud)

编辑: 根据@ Korem的建议,我也尝试使用partial如下:

s_na_mean = partial(pd.Series.mean, skipna = True)    
data.groupby(groupbyvars).agg({'amount': [ np.nansum, s_na_mean ]}).reset_index() 
Run Code Online (Sandbox Code Playgroud)

但得到这个错误:

error: 'functools.partial' object has no attribute '__name__'
Run Code Online (Sandbox Code Playgroud)

Kor*_*rem 7

使用numpy的nansumnanmean:

from numpy import nansum
from numpy import nanmean
data.groupby(groupbyvars).agg({'amount': [ nansum, nanmean]}).reset_index() 
Run Code Online (Sandbox Code Playgroud)

作为numpy旧版本的解决方法,也是修复上次尝试的方法:

当你这样做时,pd.Series.sum(skipna=True)你实际上调用了该方法.如果你想这样使用它你想要定义一个部分.所以,如果你没有nanmean,让我们定义s_na_mean并使用它:

from functools import partial
s_na_mean = partial(pd.Series.mean, skipna = True)
Run Code Online (Sandbox Code Playgroud)