如何对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
相关产品推荐
相关产品推荐

