如何按fare_type分组,计算各距离下不同时段的平均票价并合并
新加坡地铁轻轨票价平均计算解决方案
你要实现的需求完全可以用pandas的groupby+agg操作完成,不用复杂的三层循环,代码更简洁高效。以下是修正后的完整代码:
1. 数据读取与distance字段清洗(优化版)
import pandas as pd # 读取数据 mrt = pd.read_csv(r'C:\Users\ASUS\Downloads\fares-for-mrt-and-lrt-effective-from-26-december-2022.csv', na_values='na') # 清洗distance字段:移除km单位,转换为数值 mrt['distance'] = mrt['distance'].str.replace('km', '', regex=False) def process_distance(s): if '-' in s: # 处理区间格式,取区间上限 return float(s.split('-', 1)[1]) elif 'Up to' in s: # 处理上限格式,提取数值 return float(s.split('Up to ', 1)[1]) elif 'Over' in s: # 处理超限格式,生成代表值 base_value = float(s.split('Over', 1)[1]) return base_value + 0.1 else: # 直接转换纯数值格式 return float(s) # 应用清洗函数 mrt['distance'] = mrt['distance'].apply(process_distance)
2. 计算各fare_type对应distance的平均票价
# 按"票价类型(fare_type)"和"距离(distance)"分组,计算不同时段的平均票价 # 注意:将`fare`替换为你数据中实际的票价列名(比如card_fare、cash_fare等) avg_fares = mrt.groupby(['fare_type', 'distance'])['fare'].mean().reset_index() # 重命名列名,提升可读性 avg_fares.rename(columns={'fare': 'average_fare'}, inplace=True) # 查看最终结果 print(avg_fares)
关键说明
- 放弃三层循环:pandas的分组聚合是向量化实现,比手动循环效率高数倍,还能避免循环中常见的索引错误、赋值警告等问题。
- 分组逻辑:
groupby(['fare_type', 'distance'])确保同一票价类型、同一距离下的所有时段数据被合并,mean()自动计算这些时段的票价平均值。
内容的提问来源于stack exchange,提问作者mobly elliot
相关产品推荐
相关产品推荐

