You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:42:28