Python3如何在Pandas Dataframe上实现滑动窗口计数

标签 python pandas

我想从大型 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”列中的元素数量,以确定落在每个滑动窗口桶中的值的数量。

例如,如果窗口大小为 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)]

现在检查每个范围内“Number”有多少个观测值:

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    

对于随机生成的数字,这给出:

    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

关于Python3如何在Pandas Dataframe上实现滑动窗口计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079885/

相关文章:

python - 使用 NAN 替换强制转换非数字 numpy 数组

python - Pygame pygame.Rect 如何将文本添加到矩形中并将其在屏幕上移动?

python - 查找 PySpark 中给定周内的行数

python - 我想从 CSV 文件中获取数据并放入两个不同的数组变量中

python - 如何在Python,Pandas中按条件从另一列中删除一列的部分值?

python - 如何在字典中使用for循环

python - 具有自定义数据的 NLTK 命名实体识别

python - 仅当其字符串值不为空时才将字典项添加到集合中的简便方法?

python - 在 Pandas DataFrame 中将字符串列直接转换为日期格式(不是日期时间)

python - (pandas) 根据groupby和column条件填充NaN