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

如何用Pandas时间序列筛选血糖变化用户并计算变化值

高效筛选血糖随时间变化的用户并计算变化值

问题背景

现有如下血糖读数数据集:

Patient_id    timestamp    date          time    blood_sugar
0   pid11928    1.670000e+12    30-12-22    16:53:20    100
1   pid11928    1.600000e+12    05-10-20    12:46:40    98
2   pid11928    1.580000e+12    10-03-20    3:13:20     102
3   pid12334    1.480000e+12    07-01-17    17:26:40    99
4   pid12334    1.490000e+12    03-05-17    11:13:20    98
5   pid14556    1.500000e+12    30-06-17    8:06:40     115
6   pid14556    1.490000e+12    06-03-17    14:20:00    114
7   pid11223    1.600000e+12    11-09-20    7:40:00     100
8   pid11223    1.590000e+12    15-07-20    10:46:40    100
9   pid11223    1.580000e+12    21-03-20    17:00:00    95

需要筛选出血糖在时间区间内升高或降低的用户,并计算其血糖变化值。此前按唯一用户拆分DataFrame的方法在大数据集下效率低下,需要更高效的解决方案。

高效解决方案(基于Pandas)

利用Pandas的groupby分组操作结合聚合函数,无需拆分DataFrame,直接批量处理所有用户,适合大数据场景:

步骤1:导入数据并预处理

确保timestamp为数值类型(已在数据中),如果是字符串格式,可先转换:

import pandas as pd

# 读取数据集(示例)
df = pd.DataFrame({
    'Patient_id': ['pid11928', 'pid11928', 'pid11928', 'pid12334', 'pid12334', 'pid14556', 'pid14556', 'pid11223', 'pid11223', 'pid11223'],
    'timestamp': [1.67e12, 1.6e12, 1.58e12, 1.48e12, 1.49e12, 1.5e12, 1.49e12, 1.6e12, 1.59e12, 1.58e12],
    'date': ['30-12-22', '05-10-20', '10-03-20', '07-01-17', '03-05-17', '30-06-17', '06-03-17', '11-09-20', '15-07-20', '21-03-20'],
    'time': ['16:53:20', '12:46:40', '3:13:20', '17:26:40', '11:13:20', '8:06:40', '14:20:00', '7:40:00', '10:46:40', '17:00:00'],
    'blood_sugar': [100, 98, 102, 99, 98, 115, 114, 100, 100, 95]
})

步骤2:分组计算血糖变化值

按Patient_id分组,对每个组按timestamp升序排序(从最早到最晚记录),然后提取最早和最晚的血糖值,计算变化量:

# 分组并计算每个用户的首次、末次血糖及变化值
result = df.groupby('Patient_id').apply(
    lambda x: x.sort_values('timestamp').assign(
        first_bs=lambda x: x['blood_sugar'].iloc[0],
        last_bs=lambda x: x['blood_sugar'].iloc[-1],
        bs_change=lambda x: x['blood_sugar'].iloc[-1] - x['blood_sugar'].iloc[0]
    ).iloc[-1][['first_bs', 'last_bs', 'bs_change']]
).reset_index()

步骤3:筛选目标用户

根据bs_change的值筛选出血糖升高(>0)或降低(<0)的用户:

# 筛选血糖升高的用户
increased_users = result[result['bs_change'] > 0]
# 筛选血糖降低的用户
decreased_users = result[result['bs_change'] < 0]
# 筛选血糖无变化的用户(可选)
unchanged_users = result[result['bs_change'] == 0]

结果展示

运行上述代码后,result的输出为:

Patient_id  first_bs  last_bs  bs_change
0    pid11223        95      100          5
1    pid11928       102      100         -2
2    pid12334        99       98         -1
3    pid14556       114      115          1
  • 血糖升高的用户:pid11223(变化+5)、pid14556(变化+1)
  • 血糖降低的用户:pid11928(变化-2)、pid12334(变化-1)

方案优势

  • 无需拆分DataFrame,通过groupby+apply批量处理,避免循环遍历用户,效率大幅提升
  • 逻辑清晰,仅需3步即可完成筛选和计算,适合百万级以上的大数据集
  • 可灵活扩展,比如计算任意时间区间的变化值(只需在分组后筛选时间范围再聚合)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:10:34