Python处理百万行航班数据分组计数效率低,求高效处理方案
高效处理方案
方案1:使用Pandas(最推荐,百万行数据处理耗时<1秒)
直接用Pandas的向量化分组能力,完全替代嵌套循环,代码示例:
import pandas as pd # 读取本地数据文件,sep='\s+'适配任意多空格分隔,header=None表示原文件没有表头 df = pd.read_csv('你的数据文件路径.txt', sep='\s+', header=None, names=['出发国', '目的地国', '航班日期']) # 按三个维度分组统计航班数量,reset_index会把分组键转为普通列方便后续查询 count_result = df.groupby(['出发国', '目的地国', '航班日期']).size().reset_index(name='航班数量') # 单独查询特定组合的数量:比如2020年3月2日US飞AU的航班数 specific_count = count_result[(count_result['出发国'] == 'US') & (count_result['目的地国'] == 'AU') & (count_result['航班日期'] == '02/03/2020')]['航班数量'].iloc[0] print(specific_count)
如果数据已经加载为Python列表,无需读文件,直接转DataFrame即可:df = pd.DataFrame(你的列表变量, columns=['出发国', '目的地国', '航班日期'])
方案2:使用Python标准库(无需安装第三方依赖)
用collections.Counter仅遍历1次数据即可完成统计,时间复杂度O(n),百万行处理耗时<3秒:
from collections import Counter # 假设你的数据集已存为列表,每个元素是(出发国, 目的地国, 航班日期)格式的三元组 flight_list = [ ('US', 'AU', '02/03/2020'), ('US', 'CN', '03/04/2020'), # 剩余所有数据... ] # 直接统计所有三元组的出现次数 count_counter = Counter(flight_list) # 查询特定组合的数量,无匹配时返回0 specific_count = count_counter.get(('US', 'AU', '02/03/2020'), 0) print(specific_count) # 如需转成结构化列表结果,遍历Counter即可 result_list = [(*key, val) for key, val in count_counter.items()]
注意事项
- 三层嵌套循环的时间复杂度为O(n³),百万行数据的运算量达到1e18级别,运行几周都无法得出结果属于正常情况,上述两种方案均为O(n)时间复杂度,仅需遍历一次数据即可完成统计。
- 注意统一日期格式,避免把
dd/mm/yyyy和mm/dd/yyyy格式混淆导致统计错误。
内容的提问来源于stack exchange,提问作者María José Peláez
相关产品推荐
相关产品推荐

