如何用Python Pandas获取2010年事故Top3区域?代码输出异常求助
修正方案
原代码问题分析
- 错误将
Date列当作DataFrame索引处理(df.index.year),但实际Date是普通字符串格式列,无法直接提取年份。 - 直接对
Accident列调用nlargest,仅会返回Accident字段的Yes/No条目,无法统计每个区域的事故总数。
修正步骤及代码
第一步:转换日期格式并筛选2010年事故记录
先把Date列转为datetime类型,方便提取年份,同时筛选出2010年且发生事故的记录:
# 转换Date列为datetime类型,匹配日/月/年的格式 df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y') # 筛选2010年且事故状态为Yes的记录 filtered_df = df[(df['Date'].dt.year == 2010) & (df['Accident'] == 'Yes')]
第二步:统计区域事故数并排序取前3
按Area分组统计事故次数,降序排序后提取前3个区域:
# 分组统计每个区域的事故总数 accident_count = filtered_df.groupby('Area').size().sort_values(ascending=False) # 提取前3个区域的名称 top_3_areas = accident_count.head(3).index.tolist()
第三步:按要求输出结果
遍历列表,每行输出一个区域名称:
for area in top_3_areas: print(area)
完整可运行代码
import pandas as pd # 模拟原始数据(实际使用时替换为你的5万条数据) df = pd.DataFrame({ 'Area': ['Wendly', 'Wendly', 'Reet', 'Reet', 'Sarall', 'Sarall', 'Sarall'], 'Date': ['8/8/2010', '2/9/2010', '1/5/2010', '9/11/2010', '14/3/2010', '7/6/2010', '23/6/2014'], 'SpeedOver': [15, 35, 65, 10, 18, 23, 25], 'Risk': ['L', 'L', 'M', 'M', 'M', 'H', 'H'], 'Accident': ['No', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes'] }) # 转换日期格式 df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y') # 筛选目标记录 filtered_df = df[(df['Date'].dt.year == 2010) & (df['Accident'] == 'Yes')] # 统计排序取前3 accident_count = filtered_df.groupby('Area').size().sort_values(ascending=False) top_3_areas = accident_count.head(3).index.tolist() # 输出结果 for area in top_3_areas: print(area)
最终输出
Reet Wendly Sarall
内容的提问来源于stack exchange,提问作者dangoqut132
相关产品推荐
相关产品推荐

