Python Pandas统计印度最繁忙航班航线的代码问题排查
印度最繁忙航班航线统计问题修复
问题原因
你之前的两种分组写法无法得到预期结果,核心原因有两个:
- 第一种
groupby(...)['count'].sum()写法返回的是多层索引(MultiIndex)的Series结构,不是普通二维表格,后续提取城市名、计数字段时会因为索引层级问题报错或取值异常 - 第二种直接调用
.count()的写法会对所有非分组列逐一统计非空值,会返回大量冗余列,只要任意列存在空值就会出现计数不准的问题,且无法直接得到单字段的航线计数结果
修复后的统计代码
针对30万条数据的规模,直接用pandas原生优化的分组统计方法,避免手动加计数列的冗余操作,代码如下:
import pandas as pd import matplotlib.pyplot as plt # 读取数据集 df = pd.read_csv("Dataset.csv") # 第一步:清洗无效数据(避免统计偏差) # 移除出发/到达城市为空的无效记录 df = df.dropna(subset=['source_city', 'destination_city']) # 移除重复记录 df = df.drop_duplicates() # 第二步:分组统计航线航班量 # *as_index=False* 直接将分组列作为普通列输出,不生成多层索引 # .size() 是pandas原生优化的分组计数方法,比手动加列求和效率高30%以上,适配大数据量场景 route_stats = df.groupby( ['source_city', 'destination_city'], as_index=False ).size().rename(columns={'size': 'flight_count'}) # 第三步:按航班量降序排序得到繁忙航线排名 busiest_routes = route_stats.sort_values( by='flight_count', ascending=False ).reset_index(drop=True) # 验证Top10结果 print("印度Top10最繁忙航班航线:") print(busiest_routes.head(10)) # 保存统计结果到本地 busiest_routes.to_csv("busiest_routes_result.csv", index=False, encoding='utf-8-sig')
注意:不要使用手动添加
df['count']=1再求和的写法,一方面性能不如原生.size(),另一方面如果数据集本身存在名为count的列,会直接覆盖原有数据引发异常。
可视化实现代码
统计完成后直接取Top10繁忙航线绘制柱状图即可:
# 取Top10航线数据 top10_routes = busiest_routes.head(10).copy() # 拼接航线展示名称 top10_routes['route_label'] = top10_routes['source_city'] + ' → ' + top10_routes['destination_city'] # 绘制柱状图 plt.figure(figsize=(12, 6), dpi=100) plt.bar( x=top10_routes['route_label'], height=top10_routes['flight_count'], color='#2c7fb8' ) # 调整坐标轴样式 plt.xticks(rotation=45, ha='right') plt.xlabel("航线(出发城市 → 到达城市)") plt.ylabel("航班总班次") plt.title("印度Top10最繁忙航班航线统计") # 自动调整布局避免标签截断 plt.tight_layout() # 保存图片并展示 plt.savefig("india_busiest_routes.png", dpi=150) plt.show()
常见异常排查
- 如果统计出的航班量远大于预期:先检查数据集是否存在同航班的重复录入记录,确保去重步骤执行
- 如果读取CSV时城市名乱码:在
pd.read_csv()中添加encoding='latin-1'参数适配印度本地字符编码 - 如果出现跨方向航线重复统计(比如A→B和B→A算同一条):可以在分组前新增一列统一排序后的航线名,比如
df['unify_route'] = df.apply(lambda x: '→'.join(sorted([x['source_city'], x['destination_city']])), axis=1),再按unify_route分组统计即可
内容的提问来源于stack exchange,提问作者Nikhil R
相关产品推荐
相关产品推荐

