Pandas中的滑动窗口分组

3
如何在 Pandas 中使用 groupby 实现滑动窗口计算?假设我有一个类似以下的数据框:
df = pd.DataFrame({'type': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'data': [1,10,2,4,3,4,5,6]})


df
  type  data
0    A     1
1    A     10
2    A     2
3    A     4
4    B     3
5    B     4
6    B     5
7    B     6

对于数据框中的每个类型,我想要确定在一个滑动尺度上在第1行和第3行之间(仅限这些行,忽略第2行)的标准差。 这意味着对于A,我想使用这些行来找到第一个标准偏差:

  type  data
0    A     1    <----
1    A     10
2    A     2    <----
3    A     4

然后在这些上面:
  type  data
0    A     1    
1    A     10   <----
2    A     2
3    A     4   <----

等等,对于此示例中的其他类型重复上述操作。您可以假设有比4种类型更多的类型和每种类型超过4行。是否有一种方法可以使用 groupby 做到这样的事情?我知道可以使用 iloc 实现这一点,但我希望有一种更优雅和标准的方法,使用 groupby 或其他 pandas 函数。我希望有类似下面的东西可以工作...

df.groupby(df.type).sliding_window(slide=2).std()

编辑:看起来滚动不起作用。我只想要用于std()的端点,而不是整个窗口。例如,第一个计算应该是std([1, 2]),因为我们将仅查看索引0和2,而忽略索引1中的值。


重复的问题:https://dev59.com/-2Yr5IYBdhLWcg3wDF_P - Erfan
也许解决方案是相同的(可能是),但在搜索pandas groupby滑动窗口时没有出现该结果。 - Bryant
此外,现在似乎滚动不起作用,所以可能不是重复的。 - Bryant
1个回答

1

rolling

df.groupby('type').rolling(3).std()

        data
type        
A    0   NaN
     1   NaN
     2   1.0
     3   1.0
B    4   NaN
     5   NaN
     6   1.0
     7   1.0

输出结果看起来不正确。我本来期望在索引0和1处看到一个值,而不是在2和3处。 - Bryant
看起来在末尾添加.shift(-2)就可以了。如果有更好的方法,请告诉我。 - Bryant
实际上@piRSquared,这样做不行,是我选择了错误的示例数据。滚动函数使用整个窗口进行std()计算,我只想使用索引0和2,似乎rolling确实只是在窗口中进行滚动计算,使用所有内容。我只想使用极端/端点。 - Bryant
此外,如果仅使用正确的值,我预计标准差约为1.41。我更新了问题,使数字更极端。 - Bryant
df.groupby('type').rolling(2).std() 给出了 ~1.41 - piRSquared
当我使用原始数据框(窗口为2)运行时,每一行都会得到0.707的结果(除了窗口中的第一行,它是NaN)。我认为滚动操作不起作用,除非我重新组织数据框以使我想要的行相邻。 - Bryant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接