数据框合并平均值,跳过 nan
Dataframe binned averages, skip nan
我有一个以下结构的数据框,为了这个问题进行了简化:
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()
returns:
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
我该如何解决这个错误并生成我想要的正确平均值?
你需要:
#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
s需要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
我有一个以下结构的数据框,为了这个问题进行了简化:
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()
returns:
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
我该如何解决这个错误并生成我想要的正确平均值?
你需要:
#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
s需要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