如何基于DataFrame的id列值绘制子图且无需透视数据?
解决方案:无需透视DataFrame实现按ID分柱子图
当然可以做到!完全不需要对DataFrame做透视操作,结合matplotlib的子图布局和pandas的分组功能就能轻松完成你的需求。下面是具体的实现步骤和代码:
实现思路
- 利用
groupby("id")直接按ID拆分原始数据,保留原有结构 - 创建对应数量的子图布局(这里是1行3列)
- 遍历每个ID的分组数据,在对应子图中绘制多列数据随timestamp的变化曲线
- 优化图表的标题、轴标签和布局,提升可读性
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 准备你的示例数据 datafr = pd.DataFrame( columns=["timestamp", "id", "col1", "col2", "col3"], data=[[1,"a", 1, 2, 3], [1,"b", 1, 2, 3], [1,"c", 1, 2, 3], [2,"a", 1, 2, 3], [2,"b", 1, 2, 3], [2,"c", 1, 2, 3]] ) # 创建1行3列的子图网格,可根据需求调整尺寸 fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5)) # 遍历每个ID分组和对应的子图轴 for (id_val, group), ax in zip(datafr.groupby("id"), axes.flat): # 在当前子图绘制col1/col2/col3的曲线,X轴绑定timestamp group.plot(x="timestamp", y=["col1", "col2", "col3"], ax=ax) # 设置子图标题,明确对应ID ax.set_title(f"ID: {id_val}") # 配置坐标轴标签 ax.set_xlabel("Timestamp") ax.set_ylabel("Value") # 显示图例区分不同列 ax.legend() # 自动调整子图间距,避免元素重叠 plt.tight_layout() # 展示最终图表 plt.show()
关键细节说明
datafr.groupby("id"):直接按ID拆分数据,完全保留原始DataFrame的列结构,不需要做任何透视或重塑操作axes.flat:将二维的子图轴数组转为一维,方便和分组结果一一对应遍历group.plot(...):对分组后的子DataFrame直接调用绘图方法,指定x轴和要展示的y列,自动在对应子图中生成多条曲线
这种方法既高效又直观,完美匹配你“不透视DataFrame”的需求,同时清晰展示每个ID下多列数据的时间趋势。
内容的提问来源于stack exchange,提问作者Amy21
相关产品推荐
相关产品推荐

