如何用Python Pandas按ID可视化类别值的时序序列矩阵?
将ID的类别事件序列可视化为彩色矩阵
步骤1:整理数据结构
首先把原始长格式DataFrame转换为宽格式,让每一行对应一个ID,每一列对应一个时间步:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造原始数据 data = { 'ID': [1,2,2,3,2,1,1,3,3], 'CAT': ['A','C','B','A','A','B','A','B','B'] } df = pd.DataFrame(data) # 给每个ID的事件分配时间步(按原始顺序) df['time_step'] = df.groupby('ID').cumcount() # 转换为宽表:行=ID,列=time_step,值=CAT pivot_df = df.pivot(index='ID', columns='time_step', values='CAT')
步骤2:类别转数值(适配绘图要求)
绘图函数需要数值输入,将类别映射为唯一数值:
# 定义类别到数值的映射关系 cat_map = {'A':0, 'B':1, 'C':2} numeric_matrix = pivot_df.replace(cat_map).values
步骤3:绘制彩色矩阵
使用seaborn.heatmap实现可视化,自定义颜色对应不同类别:
# 定义对应类别的颜色(可按需调整) colors = ['#1f77b4', '#ff7f0e', '#2ca02c'] # A=蓝色, B=橙色, C=绿色 cmap = plt.cm.colors.ListedColormap(colors) # 绘制热图 plt.figure(figsize=(6,4)) sns.heatmap(numeric_matrix, annot=pivot_df.values, # 显示类别字母 fmt='', # 取消数值格式化 cmap=cmap, cbar=False, # 隐藏默认颜色条 xticklabels=[f'步{i+1}' for i in range(pivot_df.shape[1])], yticklabels=pivot_df.index) plt.xlabel('时间步') plt.ylabel('ID') plt.title('ID的类别事件序列可视化') plt.show()
补充优化
如果需要保留颜色条并对应类别,可替换cbar=False为以下代码:
cbar = plt.gcf().axes[-1] cbar.set_ticks([0.33, 1, 1.67]) cbar.set_ticklabels(['A', 'B', 'C'])
- 提前确认每个ID的事件数量一致,避免转换宽表时出现缺失值,可通过
df.groupby('ID').size().nunique() == 1验证。
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

