按日期分组求最大心率后,如何获取其在原DataFrame中的索引?
解决方案
要实现按日期分组获取每日最高心率,并保留原DataFrame的对应索引,你可以借助Pandas的idxmax()函数,它能直接返回列中最大值对应的原行索引。以下是具体实现步骤:
步骤1:提取日期分组键
首先从timestamp列中提取日期部分,作为分组依据:
import pandas as pd # 你的原始数据 data= pd.DataFrame( [[pd.Timestamp('2022-08-05 10:11:04'), 140, 120], [pd.Timestamp('2022-08-05 10:11:05'), 400, 155], [pd.Timestamp('2022-08-05 10:13:06'), 400, 160], [pd.Timestamp('2022-08-05 10:15:07'), 100, 155], [pd.Timestamp('2022-08-05 10:15:08'), 430, 160], [pd.Timestamp('2022-09-05 10:17:09'), 430, 130], [pd.Timestamp('2022-09-07 10:17:10'), 430, 131], [pd.Timestamp('2022-09-07 10:17:11'), 430, 170], [pd.Timestamp('2022-09-07 10:18:06'), 430, 156], [pd.Timestamp('2022-09-07 10:19:07'), 130, 155], [pd.Timestamp('2022-09-07 10:19:08'), 130, 160], [pd.Timestamp('2022-09-07 10:19:09'), 430, 130], [pd.Timestamp('2022-09-07 10:20:10'), 430, 131], [pd.Timestamp('2022-09-07 10:20:11'), 130, 170]], columns=['timestamp', 'power', 'heart rate']) # 提取日期列用于分组 data['date'] = data['timestamp'].dt.date
方法1:获取每组首个最高心率的原索引
如果每日最高心率可能重复,idxmax()会返回第一个出现最大值的行索引,这是最常用的场景:
# 按日期分组,获取每组最高心率对应的原索引 max_hr_indices = data.groupby('date')['heart rate'].idxmax() # 根据索引筛选原数据,保留原索引列 result = data.loc[max_hr_indices].reset_index(names='original_index') # 整理输出列 result = result[['original_index', 'date', 'timestamp', 'power', 'heart rate']] print(result)
输出结果示例:
original_index date timestamp power heart rate 0 2 2022-08-05 2022-08-05 10:13:06 400 160 1 5 2022-09-05 2022-09-05 10:17:09 430 130 2 7 2022-09-07 2022-09-07 10:17:11 430 170
方法2:获取所有每日最高心率的原索引
如果需要保留所有达到当日最高心率的行(比如同一天有多个相同的最高心率值),可以用transform()标记符合条件的行,再筛选:
# 标记每行是否为当日最高心率 data['is_max_hr'] = data['heart rate'] == data.groupby('date')['heart rate'].transform('max') # 筛选所有符合条件的行,保留原索引 result_all = data[data['is_max_hr']].reset_index(names='original_index') # 整理输出列 result_all = result_all[['original_index', 'date', 'timestamp', 'power', 'heart rate']] print(result_all)
输出结果示例:
original_index date timestamp power heart rate 0 2 2022-08-05 2022-08-05 10:13:06 400 160 1 4 2022-08-05 2022-08-05 10:15:08 430 160 2 5 2022-09-05 2022-09-05 10:17:09 430 130 3 7 2022-09-07 2022-09-07 10:17:11 430 170 4 13 2022-09-07 2022-09-07 10:20:11 130 170
补充说明
idxmax()返回的是原DataFrame的行索引,确保你能直接关联到原始数据的所有信息。- 如果你的DataFrame已经有自定义索引,上述方法同样适用,
reset_index(names='original_index')会将原索引转为普通列。
内容的提问来源于stack exchange,提问作者pepijn
相关产品推荐
相关产品推荐

