Python 环境加载中…

用几个数说清一列

3 道练习题·预计 45 分钟·做对一题解锁下一段

完整通读本章 →

教学 01 / 08· 已读

前言

上一章学会了从表里挑出想要的数据。可是挑出来以后,还得把它说清楚才行。比如记账本里一千多笔花销,一笔一笔地看,看到眼花,也说不出个所以然。要是有人问你「你平时一笔花多少钱」,总不能把整本账递过去吧?

这时候,就得用几个数,把一整列说清楚:一般是多少?最多的是哪种?大的有多大?波动又有多大?这几个数,在统计学里叫描述统计。

其实第 2 章用 describe() ,已经一下子算出了好几个,还发现了一件怪事:平均每笔 51 元,可一半的花销都不超过 21 元。当时说这一点第 4 章还会细讲,指的就是这一章。所以这一章,就把这几个数一个一个拆开,弄清楚它们各自在说什么,什么时候该信哪一个。

学这一章之前,需要先学完 数据分析课第 3 章 。

目录

这一章会学到:

  • 一、平均数和中位数——「一般是多少」该信哪个
  • 二、数一数——value_counts() ,以及占多大比例
  • 三、分位数——大的有多大,quantile() 和 nlargest()
  • 四、标准差——波动有多大
  • 五、常见坑
  • 六、自己查一次文档——用 value_counts() 把金额分成几段
  • 七、小结与回看

学完这一章,别人问起「你平时一笔花多少钱」,你能用几个数答得又准又清楚。

教学 02 / 08

一、平均数和中位数

先来解开第 2 章留下的那个疑问:平均数和中位数,为什么会差那么多?别急着看记账本,先用四个数做个小实验。这里要用到 pd.Series() ,它能直接把一个列表变成一列:

Python· 可在网页运行
import pandas as pd

s = pd.Series([10, 20, 30, 1000])
print(s.mean())
print(s.median())

输出的结果:

文本
265.0
25.0

两个数差了一大截。它们各是怎么算出来的呢?

  • mean() 算的是平均数:把所有数加起来,再除以个数。(10 + 20 + 30 + 1000) ÷ 4 = 265。
  • median() 算的是中位数:先从小到大排好,再取正中间的那个数。个数是双数的时候,就取中间两个的平均,(20 + 30) ÷ 2 = 25。

各位童鞋发现没有?四个数里有三个都不超过 30,平均数却是 265,没有一个数接近它。为什么会这样?就是因为那一个 1000,把平均数拉了上去。中位数就不一样了,它只看排在中间的是谁。最大的那个数是 1000 也好,100 万也好,中位数都不受影响。

小实验看明白了,再回到记账本。这回分两次算:先算全部的花销,再把房租去掉,算一遍。

Python· 可在网页运行
import pandas as pd

ledger = pd.read_csv('ledger_2026.csv')
print(round(ledger['cost'].mean(), 2))
print(ledger['cost'].median())

no_rent = ledger[ledger['item'] != '房租']
print(round(no_rent['cost'].mean(), 2))
print(no_rent['cost'].median())

输出的结果:

文本
51.1
21.0
29.21
21.0

对比一下:去掉一年的 12 笔房租以后,平均数从 51 元一下子掉到了 29 元;中位数却纹丝不动,还是 21 元。

所以,「平时一笔花多少」这个问题,中位数答得更准:21 元左右。那平均数是不是就没用了呢?也不是。平均数乘上笔数,就是总额,所以算总账离不开它。而且,两个数差得越远,说明数据里「特别大」或「特别小」的值越多,这本身就是一条值得注意的信息。

把两者放在一起,比一比:

平均数 mean()中位数 median()
怎么算加起来除以个数排好序取中间
受特别大、特别小的值影响吗受,影响很大几乎不受
适合回答一共多少、平均分到每一个是多少一般情况是多少

先做一道练习:晚饭一般花多少?用平均数和中位数各算一遍。

练习 1 / 3晚饭一般花多少题目有问题?

读进记账本,挑出名称(item)是「晚饭」的那些金额,分两行打印:平均数(用 round() 保留两位小数)和中位数。

运行后的输出应该是:

文本
39.58
40.0
main.py
可编辑
做对当前题解锁下一段 ·03

推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai

学习目录