Python3如何在数据帧上实现滑动窗口计数

Python3如何在数据帧上实现滑动窗口计数,python,pandas,Python,Pandas,我想从大熊猫数据帧创建一个绘图。数据采用以下格式 Type Number ...unimportant additional columns Foo 13 ... Foo 25 ... Foo 56 ... Foo 56 ... Bar 10 ... Bar 10 ... Bar 11 ... Bar 23 ... 我需要计算从x到x+I的滑动窗口中“number”列

我想从大熊猫数据帧创建一个绘图。数据采用以下格式

Type     Number    ...unimportant additional columns

Foo       13  ...
Foo       25  ...
Foo       56  ...
Foo       56  ...
Bar       10  ...
Bar       10  ...
Bar       11  ...
Bar       23  ...
我需要计算从x到x+I的滑动窗口中“number”列的元素数,以确定每个滑动窗口存储桶中的值数

例如,如果窗口大小为i=10,从x=0开始,每一步增加x 1,则“Foo”的滑动窗口桶上述示例的正确结果为:

      Foo    Bar

  0    0      2    #(0-10)
  1    0      3    #(1-11)
  2    0      3    #(2-12)
  3    1      3    #(3-13)
  4    1      3    #(4-14)
   .
   .
   .
  20   1      1    #(13-23)
  21   0      1    #(14-24)
  22   1      1    #(15-25)
   . 
   .
   .
答案将有df.max().max-[Window Length]行和len(df.columns)列

生成类似数据帧的玩具代码可能如下所示:

import pandas as pd
import numpy as np

str_arr = ['Foo','Bar','Python','PleaseHelp']
data1 = np.matrix(np.random.choice(str_arr, 100, p=[0.5, 0.1, 0.1, 0.3])).T
data2 = np.random.randint(100, size=(100,1))
merge = np.concatenate((data1,data2), axis=1)

df = pd.DataFrame(merge, index=range(100), columns=['Type','Number'])
df.sort_values(['Type','Number'], ascending=[True,True], inplace=True)
df = df.reset_index(drop=True)
如何有效地生成这样的列表


编辑说明:感谢FLab在我澄清问题之前回答了我的问题。

以下是我建议的解决方案

为了方便起见,让我们强制“Number”列为int

df['Number'] = df['Number'].astype(int)
定义所有可能的范围:

len_wdw = 10
all_ranges = [(i, i+len_wdw) for i in range(df['Number'].max()-len_wdw)]
现在检查每个范围内“数字”的观测值:

def get_mask(df, rg):
    #rg is a range, e.g. (10-20)
    return (df['Number'] >= rg[0]) & (df['Number'] <= rg[1])

result = pd.concat({ rg[0] : 
                        df[get_mask(df, rg)].groupby('Type').count()['Number']
                   for rg in all_ranges},
                 axis = 1).fillna(0).T    

如果您没有将代码表述为一个庞大的带有
np的单行程序,那么就更容易为您提供帮助。连接
等。将其分解为多个步骤并说明清楚。好的,谢谢您的建议。让我知道是否最好进一步细分。您可能想在排序后重置索引?是的,我应该这样做。我会想办法的。只需在行的末尾添加.reset_index(drop=True),我就将其标记为已接受,并向上投票。我的声望太低了,没有人会投票支持我。谢谢FLab,在玩了你给我的代码之后,我意识到这几乎是我想要的,但不完全是。您能否将范围行上的答案编辑为:范围内i(df['Number'].max()-len_wdw)的所有_范围=[(i,i+len_wdw)好的地方,更改为accordinglyFLab,感谢您的帮助。随着“Number”中的最大值变得非常大,此解决方案的计算量越来越大。一个解决方案是增加窗口和步长。另一个解决方案是实现在数据帧行上迭代的解决方案,而不是迭代oveRealObjor。关于这个有什么想法吗?嗯,这取决于你在追求什么。你确定你需要重叠的范围吗?为什么不考虑(1-10),(11-20)等等?
    Bar   Foo  PleaseHelp  Python
0   1.0   4.0         3.0     1.0
1   1.0   5.0         2.0     1.0
2   1.0   5.0         3.0     1.0
3   1.0   4.0         3.0     0.0
4   1.0   3.0         3.0     1.0
.....
85  2.0   3.0         4.0     1.0
86  1.0   3.0         3.0     1.0
87  1.0   4.0         3.0     1.0
88  1.0   4.0         4.0     1.0
89  1.0   3.0         5.0     1.0