【问题标题】:Dataframe binned averages, skip nan数据框分箱平均值,跳过 nan
【发布时间】:2017-05-24 11:42:53
【问题描述】:

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

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

如何解决这个错误并产生我想要的正确平均值?

【问题讨论】:

  • 我认为有一些问题,因为df1 = df.resample('3D', on='Date').mean() 我得到df1 = pd.DataFrame({'A': [3.0, 5.0, 8.0], 'B': [2.0, 4.5, 4.0]}, index=pd.to_datetime(['2016-01-01', '2016-01-04', '2016-01-07']))
  • 所以所有NaNs 值都被排除在均值计数之外。
  • 是的,这是正确的,平均值的计数受 NaN 值的影响,因此我正在寻找排除它们的方法。 Cumsum 和cumcount 看起来可行,但我不确定如何通过重新采样在单行上实现它。
  • 嗯,有点不同。我试着检查一下。

标签: python pandas dataframe nan binning


【解决方案1】:

你需要:

#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,省略NaNs 需要transform,同样对于cumcount 使用技巧计数1s:

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

【讨论】:

  • 谢谢你,在阅读了你的回答后,我用我正在读取的原始数据集仔细检查了一些东西,并且数据帧操作正在错误的数据帧上执行。这已更正,因此感谢您的洞察力。
  • 没问题,cumsum 和 cumcount 实现起来并不容易 ;) 祝你好运!
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 2020-08-21
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2018-02-01
相关资源
最近更新 更多