数据框合并平均值,跳过nan

时间:2017-05-24 11:42:54

标签: python pandas dataframe nan binning

我有一个以下结构的数据框,为了这个问题,它被简化了:

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

如何解决此错误并生成我想要的正确平均值?

1 个答案:

答案 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

对于cumsumcumcount而忽略了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