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

如何基于DataFrame的id列值绘制子图且无需透视数据?

解决方案:无需透视DataFrame实现按ID分柱子图

当然可以做到!完全不需要对DataFrame做透视操作,结合matplotlib的子图布局和pandas的分组功能就能轻松完成你的需求。下面是具体的实现步骤和代码:

实现思路

  1. 利用groupby("id")直接按ID拆分原始数据,保留原有结构
  2. 创建对应数量的子图布局(这里是1行3列)
  3. 遍历每个ID的分组数据,在对应子图中绘制多列数据随timestamp的变化曲线
  4. 优化图表的标题、轴标签和布局,提升可读性

完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:51:57