我有一个以下结构的数据框,为了这个问题,它被简化了:
Date A B
2016/1/1 nan nan
2016/1/2 nan nan
2016/1/3 3 2
2016/1/4 4 1
2016/1/5 nan nan
2016/1/6 6 8
2016/1/7 7 nan
2016/1/8 8 3
2016/1/9 9 5
我想要做的是创建一个3天的分级平均值,我可以使用
轻松完成df = df.resample('3D', on='Date').mean()
然而,使用这种方法,nan值被计为零值,它们会影响平均值,如下所示:
Date A B
2016/1/1 nan nan
2016/1/2 nan nan
2016/1/3 3 2
使用df.resample('3D', on='Date').mean()
返回:
Date A B
2016/1/3 1 2/3
我希望获得的地方:
Date A B
2016/1/3 3 2
在计算中忽略na值。
根据.mean()的文档,我应该能够跳过页面上列出的值:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html#pandas.Series.mean
但是当我运行以下内容时:
df = df.resample('3D', on='Date').mean(skipna=True)
返回以下内容:
UnsupportedFunctionCall: numpy operations are not valid with resample. Use .resample(...).mean() instead
如何解决此错误并生成我想要的正确平均值?
答案 0 :(得分:0)
你需要:
#mean works perfectly
df1 = df.resample('3D', on='Date').mean()
print (df1)
A B
Date
2016-01-01 3.0 2.0
2016-01-04 5.0 4.5
2016-01-07 8.0 4.0
对于cumsum
和cumcount
而忽略了NaN
的需要transform
,同样针对cumcount
使用了技巧计数1
s:
df[['A1','B1']] = df.resample('3D', on='Date').transform('cumsum')
df[['A2','B2']] = df[['A','B']].mask(df[['A','B']].notnull(), 1)
df[['A2','B2']] = df.resample('3D', on='Date')[['A2','B2']].transform('cumsum') - 1
print (df)
Date A B A1 B1 A2 B2
0 2016-01-01 NaN NaN NaN NaN NaN NaN
1 2016-01-02 NaN NaN NaN NaN NaN NaN
2 2016-01-03 3.0 2.0 3.0 2.0 0.0 0.0
3 2016-01-04 4.0 1.0 4.0 1.0 0.0 0.0
4 2016-01-05 NaN NaN NaN NaN NaN NaN
5 2016-01-06 6.0 8.0 10.0 9.0 1.0 1.0
6 2016-01-07 7.0 NaN 7.0 NaN 0.0 NaN
7 2016-01-08 8.0 3.0 15.0 3.0 1.0 0.0
8 2016-01-09 9.0 5.0 24.0 8.0 2.0 1.0