Python使用pandas如何绘制仅包含人数小于50的直方图?
原写法不生效的核心原因
你之前尝试的df[df['people'] < 50].hist()没有达到预期,本质是方法的调用对象不对:
- 这个写法是先筛选出
people值小于50的整行子集,再对这个子集(也就是一个完整的DataFrame)调用.hist()方法 - pandas中DataFrame对象的
.hist()方法,默认会为数据集内所有数值列逐个生成直方图,不是只针对people列,自然没法得到你想要的、仅针对people列筛选后的单张分布直方图
正确实现逻辑
核心顺序是:先完成行筛选,再从筛选后的结果中取出你要绘图的people列,最后对这列Series对象调用直方图方法。
- 易读的分步写法:
# 第一步:筛选出people列值小于50的所有行 filtered_df = df[df['people'] < 50] # 第二步:从筛选结果中取出people列,绘制直方图 filtered_df['people'].hist() - 等价的单行紧凑写法:
df[df['people'] < 50]['people'].hist() - 可读性更强的pandas原生筛选写法(避免多层方括号嵌套):
df.query("people < 50")['people'].hist()
常见排查项
如果调整后还是没法正常出图,检查两个高频踩坑点:
- 确认
people列的数据类型:如果导入CSV时该列被识别为字符串类型,< 50的数值比较逻辑会完全失效。可以先通过df['people'] = pd.to_numeric(df['people'], errors='coerce')将列转为数值型,自动把无法转换的无效值识别为缺失值后,再做筛选逻辑 - 如果是在.py脚本中运行代码,记得在绘图代码后补充
plt.show(),才能正常弹出展示绘制的图表,Jupyter这类交互环境下则不需要额外写这行
内容的提问来源于stack exchange,提问作者sharon
相关产品推荐
相关产品推荐

