如何将含月份事件状态的数据集转换为保留Null值的交叉频数矩阵?
宽格式事件数据转交叉频次矩阵实现方案
原始数据集
| id | january | february | march | april |
|---|---|---|---|---|
| 1 | scheduled | done | null | done |
| 2 | scheduled | scheduled | done | |
| 3 | ongoing | canceled | scheduled |
目标交叉(列联)矩阵
| event | january | february | march | april |
|---|---|---|---|---|
| scheduled | 2 | 1 | 1 | 0 |
| done | 0 | 1 | 1 | 1 |
| ongoing | 1 | 0 | 0 | 0 |
| null | 0 | 0 | 0 | 2 |
实现代码(Python pandas)
import pandas as pd # 构造原始数据 data = { 'id': [1, 2, 3], 'january': ['scheduled', 'scheduled', 'ongoing'], 'february': ['done', 'scheduled', 'canceled'], 'march': ['null', 'done', 'scheduled'], 'april': ['done', '', ''] } df = pd.DataFrame(data) # 1. 统一空值标记:把空字符串和原有的'null'都转为统一的'null' month_cols = ['january', 'february', 'march', 'april'] df[month_cols] = df[month_cols].replace({'': 'null', 'null': 'null'}) # 2. 宽表转长表,保留月份和对应事件 melted_df = df.melt(id_vars='id', value_vars=month_cols, var_name='month', value_name='event') # 3. 按事件和月份分组统计频次,然后转成宽表,缺失值填0 cross_matrix = melted_df.groupby(['event', 'month']).size().unstack(fill_value=0) # 4. 按目标顺序调整列和行(可选,确保和目标矩阵一致) target_events = ['scheduled', 'done', 'ongoing', 'null'] cross_matrix = cross_matrix.reindex(target_events)[month_cols] print(cross_matrix)
代码说明
- 统一空值:把原始数据里的空字符串(比如id2、3的april列)和写为'null'的单元格统一标记为'null',保证统计口径一致
- 宽转长:把每个月份列拆成"月份-事件"的行记录,方便后续分组统计
- 分组统计:通过
groupby+size统计每个事件在对应月份的出现次数,再用unstack转回宽表,缺失的组合用0填充 - 顺序调整:如果需要和目标矩阵的行、列顺序完全一致,用
reindex调整即可
内容的提问来源于stack exchange,提问作者Jresearcher
相关产品推荐
相关产品推荐

