如何用Python高效统计180万行数据中城市对应犯罪类型的数量
高效分析180万行城市犯罪数据的Python方案
需求说明
处理180万行数据集,核心需求如下:
- 从两个字段提取数据:
City字段:包含1个或多个城市,用~分隔,城市来自约1200个固定列表Crime字段:包含1个或多个犯罪类型,用~分隔,类型来自约70种固定列表
- 最终输出每个城市对应的各类犯罪统计数量,格式参考示例。
低效方案的问题
你提到的为每个城市创建数组、预分配犯罪类型索引的方法,不仅前期配置繁琐,还要写大量判断逻辑,完全没必要——用哈希表(Python里的字典)就能完美解决,而且不需要预先指定所有可能性。
高效实现方案
用Python标准库的collections.defaultdict实现嵌套哈希表,动态统计,全程不用提前定义城市或犯罪类型:
步骤1:导入依赖
from collections import defaultdict import csv # 若用CSV存储数据,用csv模块内存占用更低;也可以用pandas处理
步骤2:初始化统计容器
# 外层键是城市名,内层键是犯罪类型,值是对应统计数 crime_stats = defaultdict(lambda: defaultdict(int))
步骤3:遍历数据集统计
以CSV文件为例,读取并处理每一行:
with open('your_data.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: # 拆分城市和犯罪类型列表,同时清理可能的空格 cities = [city.strip() for city in row['City'].split('~')] crimes = [crime.strip() for crime in row['Crime'].split('~')] # 每个城市对应所有犯罪类型各加1 for city in cities: for crime in crimes: crime_stats[city][crime] += 1
步骤4:格式化输出结果
把统计结果转换成示例要求的格式:
# 整理成输出结构 output = [] for city, counts in crime_stats.items(): # 拼接犯罪类型和数量字符串 crime_str = ', '.join([f"{crime}({count})" for crime, count in counts.items()]) output.append({'City': city, 'Crimes': crime_str}) # 按城市排序并打印(也可以写入文件) print("| City | Crimes |") print("|----------|--------------------------------------------------|") for item in sorted(output, key=lambda x: x['City']): print(f"| {item['City'].ljust(8)} | {item['Crimes'].ljust(46)} |")
方案优势
- 零预配置:不用提前定义城市列表、犯罪类型索引,哈希表自动生成键
- 高效低耗:时间复杂度为O(NCK)(N为行数,C/K为每行平均城市/犯罪数),180万行完全能快速处理;内存只存实际出现的城市-犯罪组合,占用可控
- 代码简洁:没有冗余的if判断或索引映射逻辑,维护成本低
内容的提问来源于stack exchange,提问作者Buzz
相关产品推荐
相关产品推荐

