使用DataFrame.plot.hist与Series.plot.hist绘制直方图结果不一致
为什么两个直方图显示结果不同?
数据可从加州大学欧文分校机器学习数据库下载。
用户代码:
import pandas as pd i_94 = pd.read_csv('./Downloads/Guided_Project_ Finding_Heavy_Traffic_Indicators_on I-94/Metro_Interstate_Traffic_Volume.csv') import matplotlib.pyplot as plt %matplotlib inline # for my Jupyter notebook i_94.plot.hist(column='traffic_volume', bins=10) traffic_volume = i_94['traffic_volume'] traffic_volume.plot.hist(bins=10)
问题:我认为两者绘制的是同一列数据,直方图应该完全相同,但实际显示结果不同(见下图:上方为DataFrame绘制的直方图,左侧柱子高度明显高于下方Series绘制的直方图,两者y轴刻度范围不同)。
原因分析
核心问题出在旧版本pandas中DataFrame.plot.hist()的column参数行为异常:
- 调用
i_94.plot.hist(column='traffic_volume', bins=10)时,该版本的pandas没有正确识别column参数,导致绘图函数默认对DataFrame中所有数值列(比如temp、rain_1h、snow_1h、traffic_volume等)绘制直方图,且默认以重叠方式展示。 - 其他数值列(如
rain_1h、snow_1h存在大量0值)的直方图会和traffic_volume的直方图重叠,使得左侧柱子的高度是多列计数的叠加,因此看起来比单独绘制traffic_volume列的直方图(第二个图)更高。
解决方法
- 明确选择目标列:改用
i_94[['traffic_volume']].plot.hist(bins=10),通过切片生成仅包含目标列的DataFrame,确保只绘制该列的直方图。 - 升级pandas版本:新版本的pandas已修复
column参数的问题,升级后i_94.plot.hist(column='traffic_volume', bins=10)会正确只绘制指定列。
快速加载示例数据的代码:
import pandas as pd import requests url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00492/Metro_Interstate_Traffic_Volume.csv.gz' file = 'Metro_Interstate_Traffic_Volume.csv.gz' content = requests.get(url).content with open(file, 'wb') as f: f.write(content) i_94 = pd.read_csv(file, compression='gzip')
内容的提问来源于stack exchange,提问作者Gwater17
相关产品推荐
相关产品推荐

