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

如何在Pandas中对多列执行滚动唯一值计数?

Pandas滚动窗口内多列整体唯一值统计

针对单列,我们可以用以下代码实现滚动窗口内的唯一值计数:

df[my_col] = df[my_col].rolling(300).apply(lambda x: len(np.unique(x)))

要扩展到多列,统计滚动窗口内所有列的整体唯一值数量,这里提供两种可行方案:

方案1:基于rolling.apply的简洁实现

直接在滚动窗口回调中将多列数据展平为一维数组,再统计唯一值数量:

import pandas as pd
import numpy as np

# 示例数据集
df = pd.DataFrame({
    'A': [1, 2, 1, 3, 2],
    'B': [2, 3, 4, 2, 5],
    'C': [3, 1, 2, 4, 3]
})

window_size = 3

# 计算滚动窗口内所有列的整体唯一值数
df['rolling_unique_all'] = df.rolling(window_size).apply(
    lambda win: len(np.unique(win.values.flatten())),
    raw=True  # 启用raw参数提升处理性能
)

方案2:针对大数据集的高效实现

如果你的数据集规模较大,上述方案可能因np.unique的开销导致性能不足,可改用循环+集合的方式,利用集合去重的高效性:

def calc_rolling_unique(df, window):
    res = []
    n_rows = len(df)
    for idx in range(n_rows):
        # 确定当前窗口的行范围
        start_idx = max(0, idx - window + 1)
        window_data = df.iloc[start_idx:idx+1]
        # 展平窗口内所有数据并统计唯一值
        flat_vals = window_data.values.flatten()
        res.append(len(set(flat_vals)))
    return pd.Series(res, index=df.index)

df['rolling_unique_all'] = calc_rolling_unique(df, window_size=3)

说明

  • 方案1代码简洁易读,适合中小规模数据;
  • 方案2通过集合去重减少计算开销,在大窗口或大数据集场景下表现更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:50:20