如何用Pandas计算DataFrame中三列圈速的平均圈速?
Pandas计算排位赛平均圈速解决方案
核心思路
要计算平均圈速,必须先把分:秒.毫秒的字符串格式转换成可计算的数值(比如总毫秒数),计算平均值后再转回原时间格式。
步骤与代码
1. 准备示例数据
把你提供的数据转换成Pandas DataFrame:
import pandas as pd data = { 'number': [22, 4, 23], 'position': [1, 2, 3], 'q1': ['1:26.572', '1:26.103', '1:25.664'], 'q2': ['1:25.187', '1:25.315', '1:25.452'], 'q3': ['1:26.714', '1:26.869', '1:27.079'] } df = pd.DataFrame(data)
2. 定义时间格式转换函数
- 字符串转总毫秒数:拆分分钟、秒和毫秒,计算总时长
- 总毫秒数转回字符串格式:反向拆分后补零,保证格式统一
def time_str_to_ms(time_str): mins, sec_ms = time_str.split(':') sec, ms = sec_ms.split('.') return int(mins)*60*1000 + int(sec)*1000 + int(ms) def ms_to_time_str(total_ms): mins = total_ms // (60*1000) remaining_ms = total_ms % (60*1000) sec = remaining_ms // 1000 ms = remaining_ms % 1000 return f"{mins}:{sec:02d}.{ms:03d}"
3. 转换圈速列并计算平均值
先把q1/q2/q3转成毫秒数,计算每行的平均值,再转回时间格式:
# 转换q1-q3列为毫秒数 df[['q1_ms', 'q2_ms', 'q3_ms']] = df[['q1', 'q2', 'q3']].applymap(time_str_to_ms) # 计算平均毫秒数 df['avg_ms'] = df[['q1_ms', 'q2_ms', 'q3_ms']].mean(axis=1) # 转回时间格式得到平均圈速 df['avg_lap'] = df['avg_ms'].apply(ms_to_time_str) # 可选:删除中间辅助列 df = df.drop(['q1_ms', 'q2_ms', 'q3_ms', 'avg_ms'], axis=1)
4. 最终结果
运行后df新增avg_lap列,结果如下:
number position q1 q2 q3 avg_lap 0 22 1 1:26.572 1:25.187 1:26.714 1:26.158 1 4 2 1:26.103 1:25.315 1:26.869 1:26.096 2 23 3 1:25.664 1:25.452 1:27.079 1:26.065
注意事项
- 如果存在缺失值(比如某车手没跑q3),
mean()会自动跳过NaN值,结果依然准确 - 转换函数里的补零操作(
sec:02d、ms:03d)保证输出格式和原数据一致,避免出现1:6.57这类不规范格式
内容的提问来源于stack exchange,提问作者user23473391
相关产品推荐
相关产品推荐

