You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas时间序列的滚动窗口中获取出现频率最高的值

嘿,这个问题我太熟悉了!确实pandas的Rolling对象并没有内置的value_counts()方法(你可能手滑打错成count_values啦),不过咱们有几种实用的办法来实现滚动窗口内的众数计算,下面给你一步步拆解:

方法1:用rolling.apply()自定义众数计算函数

这是最直观的实现方式,我们可以给rolling.apply()传入一个自定义函数,专门用来计算每个滚动窗口里的众数。需要注意的是,如果窗口内有多个值出现频率相同,idxmax()会返回第一个出现的那个众数。

import pandas as pd

# 先构造一份测试数据
df = pd.DataFrame({'value': [1, 2, 2, 3, 3, 3, 2, 1]})

# 定义滚动窗口众数的计算函数
def get_window_mode(window):
    # 统计窗口内各值的出现次数,取次数最多的第一个值
    return window.value_counts().idxmax()

# 窗口大小设为2,计算滚动众数
df['rolling_mode'] = df['value'].rolling(window=2).apply(get_window_mode)

print(df)

运行后输出结果:

value  rolling_mode
0      1           NaN
1      2           2.0
2      2           2.0
3      3           3.0
4      3           3.0
5      3           3.0
6      2           3.0
7      1           2.0

注:第一行因为窗口大小为2,无法凑齐完整窗口,所以结果为NaN,这是pandas滚动窗口的默认行为。

方法2:借助scipy.stats.mode简化函数逻辑

如果你不想自己写统计逻辑,可以用scipy库自带的mode函数,它会直接返回数组的众数,平局时默认返回最小的那个值(和value_counts().idxmax()的规则略有不同,按需选择)。

import pandas as pd
from scipy.stats import mode

df = pd.DataFrame({'value': [1, 2, 2, 3, 3, 3, 2, 1]})

def get_window_mode_scipy(window):
    # scipy的mode返回结果是一个元组,第一个元素是众数值
    return mode(window, keepdims=False)[0]

df['rolling_mode'] = df['value'].rolling(window=2).apply(get_window_mode_scipy)

注意事项

  • 平局处理:如果窗口内多个值出现频率相同,两种方法的返回规则有差异:自定义函数返回先出现的众数,scipy.mode返回数值最小的众数,你可以根据业务需求修改函数逻辑(比如返回所有众数的列表)。
  • 性能问题:自定义函数的方式在数据量很大时可能会比较慢,如果需要处理百万级以上的数据,可以考虑用向量化的方式优化(比如用numpy的滑动窗口结合统计逻辑)。

内容的提问来源于stack exchange,提问作者mathology

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:57:33