web-dev-qa-db-ja.com

Pandas NaNを無視した集計

Pandas dataframe:data。具体的には、[amountOrigin]のタプルでtypesの平均と合計を取得したいのですが、平均と合計のために、以下のnumpy関数を試しました。

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

私の問題は、amount列にNaNsが含まれているため、上記のコードのresultに多くのNaN平均と合計が含まれることです。

私は両方を知っていますpd.Series.sumおよびpd.Series.mean 持ってる skipna=Trueデフォルトでは、なぜまだここでNaNsを取得しているのですか?

私もこれを試しましたが、明らかに機能しませんでした:

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

EDIT: @Koremの提案に応じて、以下のようにpartialも使用しようとしました。

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

しかし、このエラーが発生します:

error: 'functools.partial' object has no attribute '__name__'
11
Zhubarb

Numpyの nansum および nanmean を使用します。

_from numpy import nansum
from numpy import nanmean
data.groupby(groupbyvars).agg({'amount': [ nansum, nanmean]}).reset_index() 
_

古いバージョンのnumpyの回避策として、また最後の試行を修正する方法として:

pd.Series.sum(skipna=True)を実行すると、実際にメソッドが呼び出されます。このように使用したい場合は、 partial を定義します。したがって、nanmeanがない場合は、_s_na_mean_を定義して次のように使用します。

_from functools import partial
s_na_mean = partial(pd.Series.mean, skipna = True)
_
9
Korem

手遅れかもしれませんが、とにかくそれは他の人にとって役立つかもしれません。

関数を適用してみてください:

import numpy as np
import pandas as pd

def nan_agg(x):
    res = {}

    res['nansum'] = x.loc[ not x['amount'].isnull(), :]['amount'].sum()
    res['nanmean'] = x.loc[ not x['amount'].isnull(), :]['amount'].mean()

    return pd.Series(res, index=['nansum', 'nanmean'])

result = data.groupby(groupbyvars).apply(nan_agg).reset_index() 
0
Miros