如何在pandas DataFrame中计算滑动窗口内各Type的出现概率?
问题
现有一个包含Type列的pandas DataFrame,数据如下:
| Type | |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 3 |
| 4 | 2 |
| 5 | 2 |
| 6 | 3 |
| 7 | 4 |
| 8 | 2 |
需要计算每行对应的固定大小为5的滑动窗口中各Type的出现概率(POx-5代表Type x在窗口中的出现概率),并将这些概率列添加到原DataFrame中,期望结果如下:
| Type | PO1-5 | PO2-5 | PO3-5 | PO4-5 | |
|---|---|---|---|---|---|
| 0 | 1 | 0.2 | 0 | 0 | 0 |
| 1 | 2 | 0.2 | 0.2 | 0 | 0 |
| 2 | 4 | 0.2 | 0.2 | 0 | 0.2 |
| 3 | 3 | 0.2 | 0.2 | 0.2 | 0.2 |
| 4 | 2 | 0.2 | 0.4 | 0.2 | 0.2 |
| 5 | 2 | 0 | 0.6 | 0.2 | 0.2 |
| 6 | 3 | 0 | 0.4 | 0.4 | 0.2 |
| 7 | 4 | 0 | 0.4 | 0.4 | 0.2 |
| 8 | 2 | 0 | 0.6 | 0.2 | 0.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)
关键步骤说明
- 独热编码:
pd.get_dummies()将每个Type值转换为二进制列,例如Type=1时PO1-5列值为1,其余列值为0,方便后续统计次数。 - 滑动窗口统计:
rolling(window=5, min_periods=0, closed='right')创建固定大小的滑动窗口:window=5:窗口大小固定为5;min_periods=0:窗口内不足5行时,缺失的位置按0计算;closed='right':窗口包含当前行(即统计当前行及之前最多4行的数据)。
- 概率计算:将窗口内的出现次数除以窗口大小5,得到各Type的出现概率。
- 合并排序:把概率列合并到原DataFrame,调整列顺序使其与期望结果一致。
运行代码后得到的结果完全匹配需求。
内容的提问来源于stack exchange,提问作者Ako
相关产品推荐
相关产品推荐

