2017-02-28 45 views
3

我有以下示例:的Python - 熊猫 - GROUPBY和“AGG” - 骨料设置为NaN时组包含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”命令。

回答

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