如何筛选Pandas DataFrame指定年份区间数据并绘制折线图
问题修复与实现方案
现有代码已知问题
- 参数名不匹配:函数定义的入参为
lim_up、lim_donw,但循环中使用了未声明的lim_infe、lim_sup变量,运行会直接抛出变量未定义报错 - 无筛选逻辑:统计全量年份的频次后,没有按照入参的时间范围过滤数据
- 缺少可视化代码:没有实现折线图绘制的相关逻辑
完整可运行实现
首先确保已导入依赖库:
import pandas as pd import matplotlib.pyplot as plt
修正后的函数代码:
def crear_grafico(lim_down:int, lim_up:int, datos: pd.DataFrame): # 统一年份列数据类型为整数,避免字符串、整数类型不匹配导致筛选失效 datos['AnioDesmovilizacion'] = pd.to_numeric(datos['AnioDesmovilizacion'], errors='coerce') # 直接筛选符合年份范围的行,自动剔除不在上下限区间的无效数据 filtered_df = datos[datos['AnioDesmovilizacion'].between(lim_down, lim_up)] # 统计各年份出现频次,按年份升序排序保证折线图时序正确 year_freq = filtered_df['AnioDesmovilizacion'].value_counts().sort_index() # 绘制折线图 plt.figure(figsize=(10, 6)) plt.plot(year_freq.index, year_freq.values, marker='o', color='#2E86AB', linewidth=2) # 配置图表样式 plt.title('年份维度出现频次统计', fontsize=14) plt.xlabel('年份', fontsize=12) plt.ylabel('出现频次', fontsize=12) plt.grid(alpha=0.3) plt.xticks(rotation=45) plt.tight_layout() # 展示图表 plt.show() # 可选项:返回统计结果供其他业务逻辑使用 return year_freq
核心逻辑说明
- 数据类型统一:优先把年份列转为数值类型,避免因为源数据中年份是字符串、入参是整数导致匹配失败的问题,
pd.to_numeric的errors='coerce'参数会把无法转换的异常值转为空值,后续会自动过滤 - 范围筛选:用
Series.between()方法直接筛选符合上下限的行,比手动生成年份列表再遍历匹配的效率更高,代码更简洁 - 排序处理:统计频次后调用
sort_index()按年份排序,避免因为源数据年份顺序混乱导致折线图时序错乱 - 可视化配置:默认加了数据标记点、坐标轴标签、网格线等基础样式,可根据需求自行调整颜色、尺寸等参数
内容的提问来源于stack exchange,提问作者Andres Torres
相关产品推荐
相关产品推荐

