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

如何在pandas DataFrame中计算滑动窗口内各Type的出现概率?

问题

现有一个包含Type列的pandas DataFrame,数据如下:

Type
01
12
24
33
42
52
63
74
82

需要计算每行对应的固定大小为5的滑动窗口中各Type的出现概率(POx-5代表Type x在窗口中的出现概率),并将这些概率列添加到原DataFrame中,期望结果如下:

TypePO1-5PO2-5PO3-5PO4-5
010.2000
120.20.200
240.20.200.2
330.20.20.20.2
420.20.40.20.2
5200.60.20.2
6300.40.40.2
7400.40.40.2
8200.60.20.2
解决方案

核心思路是先将Type转换为独热编码,再通过滑动窗口统计每个窗口内各Type的出现次数,最后除以窗口大小5得到概率。具体实现代码如下:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({'Type': [1, 2, 4, 3, 2, 2, 3, 4, 2]})

# 生成独热编码矩阵,确保所有目标Type值都对应列
one_hot = pd.get_dummies(df['Type'], prefix='PO', suffix='-5')
# 补全缺失的Type列(如果原始数据中某Type未出现)
for type_val in [1, 2, 3, 4]:
    col_name = f'PO{type_val}-5'
    if col_name not in one_hot.columns:
        one_hot[col_name] = 0

# 计算滑动窗口内的出现次数:窗口大小5,不足5行时前面补0,包含当前行
window_counts = one_hot.rolling(window=5, min_periods=0, closed='right').sum()

# 计算概率(次数除以窗口大小5)
window_probs = window_counts / 5

# 合并概率列到原DataFrame,并调整列顺序与期望结果一致
result_df = pd.concat([df, window_probs], axis=1)
result_df = result_df[['Type', 'PO1-5', 'PO2-5', 'PO3-5', 'PO4-5']]

print(result_df)

关键步骤说明

  1. 独热编码:pd.get_dummies()将每个Type值转换为二进制列,例如Type=1时PO1-5列值为1,其余列值为0,方便后续统计次数。
  2. 滑动窗口统计:rolling(window=5, min_periods=0, closed='right')创建固定大小的滑动窗口:
    • window=5:窗口大小固定为5;
    • min_periods=0:窗口内不足5行时,缺失的位置按0计算;
    • closed='right':窗口包含当前行(即统计当前行及之前最多4行的数据)。
  3. 概率计算:将窗口内的出现次数除以窗口大小5,得到各Type的出现概率。
  4. 合并排序:把概率列合并到原DataFrame,调整列顺序使其与期望结果一致。

运行代码后得到的结果完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:10:35