如何用pandas Grouper函数创建完整10分钟分组并丢弃剩余数据?
问题描述
我的pandas数据框df结构如下:
time_stamp beats(in sec) RR BPM 0 29140.870816 0.670 0.437757 137 1 29141.333816 1.133 0.462341 129 2 29141.823816 1.623 0.490448 122 3 29142.292816 2.092 0.468517 128 4 29142.760816 2.560 0.468215 128 ... ... ... ... ... ... 3708 30762.612816 1622.412 0.426784 140 3709 30763.051816 1622.851 0.439165 136 3710 rows × 5 columns
我希望将这些数据按10分钟间隔分组,规则是:最后一个间隔的数据若不足10分钟则直接丢弃。比如根据beats(in sec)列的最大值(1622.851秒),仅能创建2个完整的10分钟分组(截至1200秒),1200秒之后的数据不纳入分析。
目前我用pd.Grouper实现分组:
agg_10m = df.groupby(pd.Grouper(freq='10Min')) agg_10m.ngroups
但这段代码生成了3个分组,请问如何使用Grouper函数或其他方法仅保留2个完整分组?
解决方案
方法1:先筛选数据再分组
先计算出最大的完整10分钟阈值(10分钟=600秒,2个完整组就是1200秒),过滤掉beats(in sec)超过1200秒的行,再进行分组:
# 计算完整分组的最大阈值:2个10分钟即1200秒 max_beat = 2 * 600 filtered_df = df[df['beats(in sec)'] <= max_beat] agg_10m = filtered_df.groupby(pd.Grouper(freq='10Min')) print(agg_10m.ngroups) # 输出2
如果需要动态计算能容纳的完整分组数,可以这样:
total_seconds = df['beats(in sec)'].max() full_groups = int(total_seconds // 600) max_beat = full_groups * 600 filtered_df = df[df['beats(in sec)'] <= max_beat] agg_10m = filtered_df.groupby(pd.Grouper(freq='10Min'))
方法2:分组后过滤不完整的组
如果不想提前过滤数据,可以先分组,然后筛选出包含完整10分钟数据的组。首先需要确保time_stamp是时间类型:
# 把time_stamp转为datetime类型(假设原始是unix时间戳,若不是请调整单位) df['time_stamp'] = pd.to_datetime(df['time_stamp'], unit='s') # 按10分钟间隔分组 agg_10m = df.groupby(pd.Grouper(key='time_stamp', freq='10Min')) # 过滤出时间跨度覆盖完整10分钟的组(用1e-6避免浮点数精度问题) full_groups = agg_10m.filter(lambda x: (x['time_stamp'].max() - x['time_stamp'].min()).total_seconds() >= 600 - 1e-6) # 重新获取符合要求的分组 final_agg = full_groups.groupby(pd.Grouper(key='time_stamp', freq='10Min')) print(final_agg.ngroups)
方法3:基于beats(in sec)直接分箱分组
既然是按beats(in sec)的累计时长分组,也可以直接对该列进行分箱,只保留完整的10分钟区间:
import numpy as np # 按600秒(10分钟)为步长创建分箱 bins = np.arange(0, df['beats(in sec)'].max(), 600) # 移除最后一个不完整的分箱 if bins[-1] + 600 > df['beats(in sec)'].max(): bins = bins[:-1] # 按分箱结果分组 agg_10m = df.groupby(pd.cut(df['beats(in sec)'], bins=bins)) print(agg_10m.ngroups) # 输出2
内容的提问来源于stack exchange,提问作者bipvan
相关产品推荐
相关产品推荐

