如何解决Pandas筛选Top10%警区数据为空及地图绘制问题?
问题解决:芝加哥涉枪袭击数据Top10%警区筛选与地图绘制修复
你的代码存在两个核心问题,导致筛选出空DataFrame且地图无法正确生成:
1. Top10%警区筛选逻辑错误
原代码错误地使用了**警区编号(Beat)的分位数来计算阈值,而我们需要的是事件数(Event Count)**的90分位数——毕竟要找的是事件最多的10%警区,和警区编号大小无关。
2. 地图数据关联错误
绘制地图时,top_10_percent_beats(事件数数据)和beat_centers(经纬度数据)没有关联,直接混用会导致经纬度与警区不匹配,必须将两个数据集按Beat字段合并后再绘图。
修正后的完整代码
import pandas as pd import plotly.express as px # 读取数据 beats_path = '/content/drive/My Drive/chicago_gun_violence_reports.csv' beats = pd.read_csv(beats_path) # 查看数据前几行(可选) print(beats.head()) # 计算每个警区的事件总数 beat_event_counts = beats['Beat'].value_counts().reset_index() beat_event_counts.columns = ['Beat', 'Event Count'] # 找出事件最多的警区 beat_with_most_events = beat_event_counts.iloc[0]['Beat'] most_events_count = beat_event_counts.iloc[0]['Event Count'] print(f"警区 {beat_with_most_events} 事件数最多,共 {most_events_count} 起") # 计算事件数的90分位数(Top10%的阈值) top_10_percent_threshold = beat_event_counts['Event Count'].quantile(0.9) # 筛选事件数Top10%的警区 top_10_percent_beats = beat_event_counts[beat_event_counts['Event Count'] >= top_10_percent_threshold] print("Top10%警区数据:") print(top_10_percent_beats) # 计算每个警区的经纬度中位数中心 beat_centers = beats.groupby('Beat').agg({'Latitude': 'median', 'Longitude': 'median'}).reset_index() # 合并事件数数据和经纬度数据(关键:确保警区与坐标对应) top_10_with_centers = pd.merge(top_10_percent_beats, beat_centers, on='Beat') # 绘制热点地图 fig = px.scatter_mapbox( top_10_with_centers, lat='Latitude', lon='Longitude', size='Event Count', hover_name='Beat', hover_data={'Event Count': True, 'Latitude': False, 'Longitude': False}, mapbox_style='carto-positron', # 可选:更换地图样式 zoom=10 # 调整地图初始缩放级别 ) fig.show()
关键修改说明
- 阈值计算修正:从
sorted_beats['Beat'].quantile(0.9)改为beat_event_counts['Event Count'].quantile(0.9),确保基于事件数筛选。 - 数据合并:用
pd.merge将事件数数据和经纬度数据按Beat合并,保证每个警区的事件数和坐标一一对应。 - 地图参数优化:添加了
mapbox_style和zoom参数,让地图显示更合理;调整hover_data隐藏冗余的经纬度信息。
内容的提问来源于stack exchange,提问作者kleyway
相关产品推荐
相关产品推荐

