首页 > 解决方案 > 在带有滚动窗口的熊猫中随时间推移获取价值计数

问题描述

我试图在 Pandas Dataframe 中随着时间的推移获得“价值流行度”。

Key RandomColumn
a   0
b   ...
c   does
d   not
a   matter
e   ...
c   ...

我想使用一个让我们说,滚动窗口为 2 并计算“这个”值的次数(从有问题的行中,已经看到)。

输出:

Key RandomColumn Popularity
a   0            0
b   ...          0
c   does         0
d   not          0
a   matter       0  <--- outside past window of 2
d   ...          1
c   ...          0  <-- outside window too
c   ....         1
c   ....         2

我一直在尝试groupby之类的东西,但后来我失去了滑动,我可以通过滚动获得滑动,但不太确定如何聚合和返回。

最后一次尝试我最终得到了类似的东西:

df['popularity']=df.groupby('key').cumcount().rolling(2, min_periods=1).sum()

但这显然是错误的。

我总是可以使用for-loop,或者可能应用索引和手动计数,但想知道在 Pandas 中是否有“正确”的方法来做到这一点。

更新:示例 #2:“计算给定值 X 在过去 N 条记录中出现的次数”,为简单起见,假设 N=2

For the Series: [a, b, b, c, d, a, b, c, c, c, a, b]
The output is:  [0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 0, 0]

前 2 个零 (0, 0) as,a 和 b,以前从未见过,然后 (1) b在过去 2 个值中出现过 1 次,依此类推。

标签: pythonpandasdataframe

解决方案


使用shift(), rolling& np.where:

  1. 首先,我们将前一行与当前行相同的所有行标记为.shift
  2. 我们计算滚动和.rolling
  3. 如果前一行不等于当前行,我们有条件地填写 0 以更正某些行,因为rolling(2)将 1 行拖得太远。
m1 = df.eq(df.shift())
m2 = df.eq(df.shift()).rolling(2).sum()

df['Popularity'] = np.where(m1, m2, 0).astype(int)

输出

   Key  Popularity
0    a           0
1    b           0
2    b           1
3    c           0
4    d           0
5    a           0
6    b           0
7    c           0
8    c           1
9    c           2
10   a           0
11   b           0

使用的输入数据框

   Key
0    a
1    b
2    b
3    c
4    d
5    a
6    b
7    c
8    c
9    c
10   a
11   b

推荐阅读