Pandas dataframe:data
。具体的には、[amount
とOrigin
]のタプルでtype
sの平均と合計を取得したいのですが、平均と合計のために、以下のnumpy関数を試しました。
import numpy as np
import pandas as pd
result = data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum, pd.Series.mean]}).reset_index()
私の問題は、amount
列にNaN
sが含まれているため、上記のコードのresult
に多くのNaN
平均と合計が含まれることです。
私は両方を知っていますpd.Series.sum
およびpd.Series.mean
持ってる skipna=True
デフォルトでは、なぜまだここでNaN
sを取得しているのですか?
私もこれを試しましたが、明らかに機能しませんでした:
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__'
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)
_
手遅れかもしれませんが、とにかくそれは他の人にとって役立つかもしれません。
関数を適用してみてください:
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()