如何在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
相关产品推荐
相关产品推荐

