通过滚动窗口获取随着时间推移的熊猫价值计数

时间:2019-07-27 23:52:38

标签: python pandas dataframe

我正在努力在Pandas数据框中获得“价值知名度”。

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 之类的方法,但是后来我失去了滑动性,我可以通过 rolling 来获得滑动性,但是不确定如何聚合和返回。 / p>

最后一次尝试我遇到类似这样的情况:

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

但这显然是错误的。

我总是可以使用 for循环 apply 进行索引和手动计数,但想知道熊猫中是否有“适当”的方法

更新:例子2:“计算过去N条记录中给定值X出现的次数”,为简单起见,假设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]

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

2 个答案:

答案 0 :(得分:1)

使用 shift() rolling np.where

  1. 首先,我们用.shift标记上一行等于当前行的所有行
  2. 我们用.rolling
  3. 计算滚动总和
  4. 如果前一行与当前行不相等,我们有条件地填写0以纠正某些行,因为rolling(2)拖移了第一行太远了。
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

答案 1 :(得分:0)

显然,rolling不能用于非数字对象。例如参见this answer
因此,对于可以选择N的常规解决方案,for循环可能是最好的方法。

您可以定义一个函数,例如:

def popularitycount(sr, n):
    """sr is an iterable (a list, tuple, or pandas Series), n an integer"""
    previous = []
    res = []
    for el in sr:
        res.append(previous.count(el))
        previous.append(el)
        if len(previous) > n:
            previous.pop(0)
    return pd.Series(res)

使用您的输入,将返回以下Series

0     0
1     0
2     1
3     0
4     0
5     0
6     0
7     0
8     1
9     2
10    0
11    0
dtype: int64