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