为何Pandas绘制折线图必须使用.mean()/.sum()/.median()?
Pandas分组绘图的聚合函数疑问解析
问题背景
我有一个包含date(日期)、city(城市)、country(国家)、avg_temp_c(摄氏平均气温)的Pandas DataFrame,其.info()信息如下:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 16500 entries, 0 to 16499 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 date 16500 non-null object 1 city 16500 non-null object 2 country 16500 non-null object 3 avg_temp_c 16407 non-null float64 dtypes: float64(1), object(3)
想要在同一图中绘制Toronto(多伦多)和Rome(罗马)的avg_temp_c折线图,参考代码如下:
toronto = temperatures[temperatures["city"] == "Toronto"] rome = temperatures[temperatures["city"] == "Rome"] toronto.groupby("date")["avg_temp_c"].mean().plot(kind="line", color="blue") rome.groupby("date")["avg_temp_c"].mean().plot(kind="line", color="green")
疑问:
- 为何第3、4行必须加入
.mean()?avg_temp_c本身已是气温数值。 - 用
.sum()、.median()替换.mean()结果完全相同,但去掉聚合函数后绘图显示空白。想知道原因。
核心原因解析
1. 无聚合函数无法绘图的原因
groupby("date")执行后得到的是分组后的DataFrameGroupBy对象,它本质是按日期拆分的多个数据组的集合,每个组里可能有多条记录。而折线图要求x轴(date)的每个取值对应唯一的y轴值,Pandas无法直接将多值的分组映射到折线图的单个点上,因此直接调用.plot()会显示空白。
.mean()这类聚合函数的作用,是把每个日期分组内的所有avg_temp_c值压缩成一个单一值,最终得到一个以date为索引、每个索引对应单个数值的Series,这种结构完全匹配折线图的绘图要求,所以能正常生成图形。
2. 三种聚合函数结果一致的原因
这说明你的数据中,每个城市的单个日期下只有一条avg_temp_c记录——比如Toronto的每个date对应的avg_temp_c只有一个值。
当分组内只有一个数值时:
- 均值(mean)就是这个数值本身
- 总和(sum)等于这个数值(单个值相加还是自身)
- 中位数(median)也等于这个数值(单个值的中位数就是它自己)
因此三种聚合函数处理后得到的结果完全相同,绘图效果自然一致。你可以用toronto.groupby("date").size().value_counts()验证,结果应该全为1,就能确认每个日期只有一条记录。
内容的提问来源于stack exchange,提问作者K-888
相关产品推荐
相关产品推荐

