如何使用Pandas按整秒分组计算Speed列的平均值?
按整秒对Pandas DataFrame的速度列求平均值的最优方法
问题描述
我有如下结构的DataFrame:
| Time (s) | Speed (m/s) |
|---|---|
| 1.1 | 5 |
| 1.2 | 2 |
| 1.3 | 8 |
| ... | ... |
| 8.3 | 6 |
| 8.4 | 7 |
| 8.5 | 4 |
希望按整秒对Speed (m/s)列求平均值,得到如下结构的结果:
| Time (s) | Speed (m/s) |
|---|---|
| 1 | 5 |
| ... | ... |
| 8 | 5.67 |
滚动平均无法得到预期结果,刚接触Pandas,求最优实现方法。
核心解法:分组聚合
你需要先把带小数的时间转换为整秒分组键,再通过分组计算平均值,这是最贴合需求且高效的做法,具体步骤如下:
1. 生成整秒分组依据
对Time (s)列取整数部分,把所有属于同一整秒区间的记录归为一组:
# 直接将时间列转为整数,1.1/1.9都会被归为1秒组 df['whole_second'] = df['Time (s)'].astype(int)
如果你的时间存在负数(比如回溯时间),可以用np.floor()替代,确保分组逻辑正确:
import numpy as np df['whole_second'] = np.floor(df['Time (s)']).astype(int)
2. 分组计算平均值并整理结构
按整秒分组后,对速度列求平均,最后重置索引、重命名列来匹配目标格式:
# 分组求平均,重置索引将分组键转为普通列 result = df.groupby('whole_second')['Speed (m/s)'].mean().reset_index() # 重命名列名匹配需求 result.rename(columns={'whole_second': 'Time (s)'}, inplace=True) # 可选:保留两位小数,和示例中的5.67格式一致 result['Speed (m/s)'] = result['Speed (m/s)'].round(2)
完整示例代码
import pandas as pd import numpy as np # 模拟你的原始数据 data = { 'Time (s)': [1.1, 1.2, 1.3, 8.3, 8.4, 8.5], 'Speed (m/s)': [5, 2, 8, 6, 7, 4] } df = pd.DataFrame(data) # 生成整秒分组列 df['whole_second'] = df['Time (s)'].astype(int) # 分组计算平均值并整理结构 result_df = df.groupby('whole_second')['Speed (m/s)'].mean().reset_index() result_df.rename(columns={'whole_second': 'Time (s)'}, inplace=True) result_df['Speed (m/s)'] = result_df['Speed (m/s)'].round(2) print(result_df)
运行后输出:
Time (s) Speed (m/s) 0 1 5.00 1 8 5.67
为什么滚动平均不适用?
滚动平均是基于滑动时间窗口(比如固定时长的连续窗口)计算的,而你的需求是按离散的整秒区间(1.01.999归为1秒,8.08.999归为8秒)做分组统计,两者的逻辑完全不同,所以滚动平均无法得到你想要的结果。
内容的提问来源于stack exchange,提问作者Marcus Bennett
相关产品推荐
相关产品推荐

