Python - Pandas - groupby和" agg" - 当组包含nan时,将聚合设置为nan

时间:2017-02-28 11:18:49

标签: python pandas numpy nan

我有以下示例:

index_ = pd.date_range('2001-01-01', '2010-12-31', freq = 'MS')
df_ = pd.DataFrame(np.random.randn(len(index_), 4), columns=list('ABCD'),  index = index_ )
df_.loc['2009-01-01','A'] = np.nan
df_.loc['2007-08-01','B'] = np.nan
df_.groupby(pd.TimeGrouper('A')).agg({'A': np.sum, 'B': np.mean})

我喜欢这个专栏' B' 2007年是NaN,列' A'在2009年是NaN。如何实现这一目标?我尝试了np.sum函数,因为在numpy数组中,当数组包含nan值时,它返回NaN。这可以转化为" agg"我想在这里使用的命令。

1 个答案:

答案 0 :(得分:4)

您可以在summean中使用参数skipna=False

np.random.seed(100)
index_ = pd.date_range('2001-01-01', '2010-12-31', freq = 'MS')
df_ = pd.DataFrame(np.random.randn(len(index_), 4), columns=list('ABCD'),  index = index_ )
df_.loc['2009-01-01','A'] = np.nan
df_.loc['2007-08-01','B'] = np.nan
df = df_.groupby(pd.TimeGrouper('A')).agg({'A': lambda x: x.sum(skipna=False), 
                                           'B': lambda x: x.mean(skipna=False)})
print (df)
                   B         A
2001-12-31  0.184784  0.593025
2002-12-31 -0.251913 -1.720891
2003-12-31 -0.085896 -3.060836
2004-12-31 -0.327153  6.561670
2005-12-31  0.214115  3.400988
2006-12-31  0.270536  2.972164
2007-12-31       NaN  4.175623
2008-12-31  0.429060 -2.917714
2009-12-31  0.222544       NaN
2010-12-31 -0.339483  2.021474