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

