You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:35:26