python - 在带有滚动窗口的熊猫中随时间推移获取价值计数
问题描述
我试图在 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 次,依此类推。
解决方案
使用shift()
, rolling
& np.where
:
- 首先,我们将前一行与当前行相同的所有行标记为
.shift
- 我们计算滚动和
.rolling
- 如果前一行不等于当前行,我们有条件地填写 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
推荐阅读
- python-3.x - 将 python 脚本从本地复制到远程机器
- python - 在 Python 中将一列转换为标准日期格式
- javascript - 将类型转换为不同类型时出现打字稿错误
- sql-server - 如何通过条件SQL存储过程将数据绑定到gridview
- sql-server - 使用 DataGrip - Active Directory 连接到 Azure 数据库
- ubuntu - 更改 ubuntu 服务器中特定组的文件模式
- r - 如何选择变量以在带有 R 的公式中使用它们
- spotfire - Spotfire 滚动 YTD 期间计算
- python-3.x - 为什么这显示“有时字符串索引超出范围”?
- haskell - 如何使用 Data.Data?