【发布时间】:2014-11-26 13:01:31
【问题描述】:
我汇总了我的 Pandas 数据框:data。具体来说,我想通过 [origin 和 type] 的元组获得平均值和总和 amounts。对于求平均和求和,我尝试了以下 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()
编辑:
根据@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__'
【问题讨论】:
-
你能发布一些示例数据吗?此外,首先,而不是
pd.Series.sum- 只需使用'sum'- 代码应该采用更快的路径。 -
谢谢,我决定使用
pd.Series.sum,因为它有一个skipna选项。阅读@Korem 的回答,我现在使用np.nansum。但是np.nanmean在我的numpy 版本(1.7.1)中不可用。我将尝试发布代表性数据,这可能需要一段时间。
标签: python numpy pandas aggregate nan