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

如何对Pandas健康记录DataFrame进行分组转置并实现可视化?

健康记录数据转置与可视化方案

一、数据转置:长格式转宽格式

假设你的原始DataFrame是长格式(每条记录对应一个检测项目的单次值),示例结构如下:

import pandas as pd

# 示例字典数据
health_records = [
    {"name": "血糖", "value": 5.2, "检测日期": "2024-01-01"},
    {"name": "血压", "value": 120, "检测日期": "2024-01-01"},
    {"name": "血糖", "value": 5.4, "检测日期": "2024-01-08"},
    {"name": "血压", "value": 125, "检测日期": "2024-01-08"},
    {"name": "血糖", "value": 5.6, "检测日期": "2024-01-15"},
    {"name": "血压", "value": 128, "检测日期": "2024-01-15"},
]
records_df = pd.DataFrame(health_records)

方式1:带分组标识的转置(推荐)

如果数据有时间/批次等维度标识,直接用pivot转成宽格式,每个检测项目作为列,维度标识(如日期)作为行:

wide_df = records_df.pivot(index="检测日期", columns="name", values="value")

输出结果:

name        血糖   血压
检测日期              
2024-01-01  5.2  120
2024-01-08  5.4  125
2024-01-15  5.6  128

方式2:无额外标识的转置

如果数据只有name和value两列,先给每个检测项目的数值添加序号,再转置:

# 给每个检测项目的数值按顺序加索引
records_df["序号"] = records_df.groupby("name").cumcount()
wide_df = records_df.pivot(index="序号", columns="name", values="value")

输出结果:

name  血糖   血压
序号           
0     5.2  120
1     5.4  125
2     5.6  128

二、转置格式的合理性分析

你选择的转置方向(检测项目为列)完全适配绘图需求:

  • 绘制时间趋势图时,宽格式可直接调用绘图接口,无需额外处理;
  • 对比不同检测项目的数值分布(箱线图、直方图)时,宽格式的列对应不同项目,能直接使用;
  • 若检测项目数值量级差异极大(比如血糖是个位数,体重是几十),绘图时可通过双Y轴调整,不影响格式的合理性。

三、可视化实现

1. 基于groupby结果的绘图

假设你已得到grouped_values = records_df[['name', 'value']].groupby('name')['value'].apply(list),可直接遍历绘图:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
for name, values in grouped_values.items():
    # 绘制折线图,若有时间序列可替换x轴为日期
    plt.plot(values, marker='o', label=name)

plt.title('健康检测数据趋势')
plt.xlabel('检测次数')
plt.ylabel('检测值')
plt.legend()
plt.show()

2. 基于宽格式DataFrame的绘图

宽格式更适合快速生成多项目对比图:

# 时间趋势图
wide_df.plot(kind='line', marker='o', figsize=(10, 6))
plt.title('健康检测数据随日期变化趋势')
plt.ylabel('检测值')
plt.show()

# 箱线图(查看各项目数值分布)
wide_df.plot(kind='box', figsize=(8, 5))
plt.title('各检测项目数值分布')
plt.ylabel('检测值')
plt.show()

# 柱状图(对比每次检测的各项目数值)
wide_df.plot(kind='bar', figsize=(10, 6))
plt.title('每次检测各项目数值对比')
plt.ylabel('检测值')
plt.show()

内容的提问来源于stack exchange,提问作者jasonIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:37