Python for循环追加列表后统计唯一值出现次数问题
代码错误原因
- 核心错误是打印目标错误:
Counter(crime_list)仅临时生成了统计对象,未赋值给任何变量;后续执行print(Counter)打印的是Counter类本身,而非统计结果,因此会重复输出<class 'collections.Counter'>。 - 两层循环复用
row作为迭代变量名,存在变量覆盖的隐患。 - 全局
crime_list在外层每轮循环中都重复执行无赋值的Counter计算,逻辑冗余;且未给无周边案件的商户初始化计数,会导致0案件商户从结果中缺失。 - 预先定义的
crime_number列表全程未使用,也未实现最终输出两列DataFrame的需求。
可直接运行的修正代码
import pandas as pd from geopy.distance import geodesic from collections import Counter # 初始化计数器 crime_counter = Counter() # 外层遍历汽修商户,迭代变量单独命名避免覆盖 for shop in autorepair_df.itertuples(): shop_name = shop.name shop_loc = (shop.lat, shop.lon) # 初始化当前商户的案件数为0,保证无案件商户也能出现在结果中 crime_counter[shop_name] = 0 # 内层遍历犯罪案件记录 for case in parts_and_vehicle_theft.itertuples(): case_loc = (case.GEO_LAT, case.GEO_LON) if geodesic(shop_loc, case_loc).mi <= 0.25: crime_counter[shop_name] += 1 # 转换为要求的两列DataFrame result_df = pd.DataFrame( crime_counter.items(), columns=["汽修店名称", "周边犯罪计数"] ) # 输出结果验证 print(result_df)
补充提示
- 如果数据集规模较大(例如商户、案件记录均超过千条),双重循环的O(n*m)时间复杂度会导致运行速度极慢。可以将坐标转换为平面投影坐标系后,用空间索引(如R树、KDTree)做半径匹配,运行效率能提升数十到数百倍。
- 如果存在同名汽修店,建议使用数据集里的商户唯一ID作为统计键,避免重名引发计数合并错误。
内容的提问来源于stack exchange,提问作者Dylan Vowell
相关产品推荐
相关产品推荐

