Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用滚动窗口获取随时间变化的值计数_Python_Pandas_Dataframe - Fatal编程技术网

Python 使用滚动窗口获取随时间变化的值计数

Python 使用滚动窗口获取随时间变化的值计数,python,pandas,dataframe,Python,Pandas,Dataframe,我试图在一个熊猫数据框架中获得“价值流行度” Key RandomColumn a 0 b ... c does d not a matter e ... c ... 我想使用一个lets,比方说,滚动窗口2,并计算“this”值的次数(从所讨论的行中,已经看到) 输出: Key RandomColumn Popularity a 0 0 b ... 0 c does 0 d not

我试图在一个熊猫数据框架中获得“价值流行度”

Key RandomColumn
a   0
b   ...
c   does
d   not
a   matter
e   ...
c   ...
我想使用一个lets,比方说,滚动窗口2,并计算“this”值的次数(从所讨论的行中,已经看到)

输出:

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
但这显然是错误的

我总是可以使用for循环,或者可以应用索引和手动计数,但我想知道是否有一种“正确”的方法在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]
前两个零(0,0)as,a和b以前从未见过,然后(1)b在过去的两个值中见过一次,依此类推。

使用
shift()
滚动

   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
  • 首先,我们用
    .shift
    标记上一行与当前行相等的所有行
  • 我们使用
    计算滚动和。滚动
  • 如果前一行与当前行不相等,我们有条件地填写0,以更正某些行,因为
    rolling(2)
    在1行上拖得太远
  • 输出

       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
    

    显然,您不能对非数字对象使用
    rolling
    。参见示例。
    因此,对于一个可以选择
    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)
    
    使用您的输入,将返回以下
    系列

    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
    

    你能举个更清楚的例子吗?我不明白你想计算什么。我试图更新一个新的示例和所需计算文本中的文字解释。如果N=3,,,,a,B,a是否返回[0,0,1],因为a在窗口中出现,即使它不是连续的?@ScottBoston,正确,而且窗口是“过去的N”行,因此,在你的示例中,即使N=2也返回0,0,1,因为它是N到pastI中,我认为这不起作用,前一行总是不相关的,它不是关于计算N=5000时的“连续重复值”,例如,它很清楚,在示例框架中,我使用N=2只是为了简单,我的用例实际上是N>3500
    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