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

如何用Python高效统计180万行数据中城市对应犯罪类型的数量

高效分析180万行城市犯罪数据的Python方案

需求说明

处理180万行数据集,核心需求如下:

  • 从两个字段提取数据:
    1. City字段:包含1个或多个城市,用~分隔,城市来自约1200个固定列表
    2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:59