【问题标题】:How do I make the window roll across the rows instead of the columns in Python?如何使窗口滚动到行而不是 Python 中的列?
【发布时间】:2021-09-09 02:34:21
【问题描述】:

我有以下代码按列滚动大小为 3 的窗口(即向下,如图中绿色所示)。但是,我希望窗口按行滚动(即向右滚动,如图中蓝色所示)。

window_size = 3 

numbers_series = X  #X is my dataframe
windows = numbers_series.rolling(window_size)
moving_averages = windows.mean()
moving_averages_list = moving_averages.values.tolist()
without_nans = moving_averages[window_size - 1:]
print(without_nans)

按列输出是:

但这不是我想要的——我希望它能够按行显示窗口的平均值。我该如何实现这一目标?

编辑: 在编辑上面的代码以在滚动函数中包含axis = 1之后,这是我得到的输出:

我不确定上面的 520.67、635.33 等值是如何计算的。我期待以下(第一个单元格:788 + 43 + 345)/3 = 392 等...):

【问题讨论】:

  • 回复您的编辑:即使您切换到 axis=1,这条线 without_nans = moving_averages[window_size - 1:] 仍在逐行删除。您现在需要删除列:without_nans = moving_averages[:, window_size - 1:](注意:s)。
  • ...如果您要计算最后一张图片中的第三行,您会看到 520.67、635.33 等来自哪里...
  • 正如下面的 cmets 中提到的,您可以传递 min_periods=1 以便即使在缺少与窗口大小相关的数据时也可以计算均值。
  • 知道了,非常感谢!

标签: python pandas window rolling-computation


【解决方案1】:

pandas.DataFrame.rolling 有一个轴参数。 DataFrame.rolling

DataFrame.rolling(
    window, 
    min_periods=None, 
    center=False, 
    win_type=None, 
    on=None, 
    axis=0, # Set axis to 1.
    closed=None) 

【讨论】:

  • 谢谢 - 刚刚尝试过,但它在前两列中给出了 NaN 值,并且行操作的平均值不正确
  • 窗口从 df.iloc[0,0]m 开始,但从左侧跨越到 df.iloc[0,-2]。因此,您可以偏移窗口以从 df.iloc[0,2] 开始,也可以删除前两列。
  • @Kareena 您的列式代码也给出了NaNs,但前两行。您可以通过 min_periods=1 强制它计算平均值,即使观察值少于 3 个,即前两列。另外,您如何得出平均值不正确的结论?你期待什么,你得到了什么?
  • 是的,前两列应该是 NaN。这取决于你想要什么。我不知道您想要什么,但如果您向我展示您的预期输出,我可能会有所帮助。 ;)
  • 谢谢 Florian Fasmeyer 和@MustafaAydın - 我在上面编辑了我的问题以显示输出 - 我不确定这些值是如何计算的。我还包括了一个我最初在滚动窗口大小为 3 的单元格的平均值方面寻找的 sn-p。
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2021-12-08
  • 2016-10-26
  • 2017-03-22
相关资源
最近更新 更多