重采样Pandas DatetimeIndex时如何保留关联的WorkoutID字段?
解决保留周度最大Power对应WorkoutID的问题
嘿,这个场景我太熟悉啦!你当前的代码只针对power列做重采样求最大值,所以WorkoutID列自然会被丢弃。要同时拿到每周最大power对应的训练ID,我们需要先定位到每周里power值最大的那一行,再提取对应的信息。这里给你两种实用的解决方案:
方法一:用resample+idxmax定位索引后提取
这种方法效率较高,适合数据集较大的情况:
# 先获取每周power最大值所在的原DataFrame索引 weekly_max_indices = df['power'].resample('W').idxmax() # 根据索引提取对应的WorkoutID和power值,并重命名power列 weekly_best_data = df.loc[weekly_max_indices, ['WorkoutID', 'power']].rename(columns={'power': 'best_power'})
idxmax()会返回每个周度分组中power最大值对应的原始行索引,接着用loc就能精准提取到该索引对应的WorkoutID和power值,最后重命名列让结果更清晰。
方法二:用groupby+apply直接取每组最大值行
如果习惯用分组操作,这种写法更直观:
from pandas import Grouper # 按周分组,每组取power最大的那一行的指定列 weekly_best_data = df.groupby(Grouper(freq='W')).apply( lambda group: group.loc[group['power'].idxmax(), ['WorkoutID', 'power']] ) # 调整列名和索引(可选,让结果更规整) weekly_best_data = weekly_best_data.rename(columns={'power': 'best_power'}).reset_index(drop=False)
这里用Grouper指定按周度频率分组,apply函数里对每个分组找到power最大的行,再提取需要的列即可。
注意点
如果同一周内有多个训练的power值都是最大值,上述两种方法会默认取第一个出现的那一行的WorkoutID。如果需要保留所有并列最大值的训练ID,可以把idxmax()换成group['power'] == group['power'].max()来筛选所有符合条件的行。
内容的提问来源于stack exchange,提问作者Ethanopp
相关产品推荐
相关产品推荐

