统计与筛选
这是什么:pandas 的统计与筛选,就是算总数、挑行、分组汇总这几套功夫。
为什么用:数据洗干净了,不榨一榨就白洗。真正的价值在筛选和分组:谁的成绩最高、每班平均多少,靠列表循环能写,靠 pandas 一行就够。
如何用:本章从一份干净数据起步,先用 sum()、mean()、describe() 一键出统计结果,再挑行、分组。
先准备一份干净数据:
import pandas as pd
data = {
"姓名": ["小明", "小红", "小刚", "小美", "小强"],
"班级": ["1班", "2班", "1班", "2班", "1班"],
"年龄": [18, 17, 19, 18, 20],
"成绩": [92, 88, 95, 76, 60],
}
df = pd.DataFrame(data)
一键统计
print(df["成绩"].sum()) # 总和
print(df["成绩"].mean()) # 平均数
print(df.describe()) # 一键出全套统计指标
411
82.2
年龄 成绩
count 5.000000 5.000000
mean 18.400000 82.200000
std 1.140175 14.359666
min 17.000000 60.000000
25% 18.000000 76.000000
50% 18.000000 88.000000
75% 19.000000 92.000000
max 20.000000 95.000000
describe() 自动挑出所有数字列,给出个数、均值、标准差、最小/最大值和四分位数——一行顶十行。
条件筛选:想要哪行挑哪行
方括号里放一个"条件",就只留下满足条件的行:
adults = df[df["年龄"] > 18]
print(adults)
姓名 班级 年龄 成绩
2 小刚 1班 19 95
4 小强 1班 20 60
读法:df["年龄"] > 18 先算出一列 True/False,再用它过滤 df。条件可以用 &(并且)、|(或者)组合,每个条件记得加括号:
print(df[(df["年龄"] >= 18) & (df["成绩"] >= 90)])
姓名 班级 年龄 成绩
0 小明 1班 18 92
2 小刚 1班 19 95
loc 与 iloc:精确取格子
loc:按标签取(行号、列名)iloc:按位置取(第几行第几列,从 0 数)
print(df.loc[0, "姓名"]) # 第 0 行的"姓名"列
print(df.iloc[0, 0]) # 第 0 行第 0 列
print(df.loc[1:3, ["姓名", "成绩"]]) # 行 1~3,只要两列
小明
小明
姓名 成绩
1 小红 88
2 小刚 95
3 小美 76
loc的切片1:3是含头含尾(取 1、2、3),和 Python 列表"含头不含尾"不一样——因为它按的是标签。
groupby:分组统计
"每个班的平均分是多少?"这种问题交给 groupby:
print(df.groupby("班级")["成绩"].mean())
班级
1班 82.333333
2班 82.000000
Name: 成绩, dtype: float64
三步曲:按"班级"分组 → 取"成绩"列 → 求平均。把 mean() 换成 sum()、count()、max(),就是分组求和、计数、取最大。
本章解读
| 代码 | 作用 |
|---|---|
df["成绩"].sum() / .mean() |
整列求和 / 平均 |
df.describe() |
数字列全套统计一键出 |
df[df["年龄"] > 18] |
条件筛选,留下 True 的行 |
df.loc[行, 列] |
按标签取数据 |
df.iloc[行, 列] |
按位置取数据 |
df.groupby("班级")["成绩"].mean() |
分组统计三步曲 |
记忆口诀
describe 看全局,方括号装条件,loc 按名 iloc 按位,groupby 一分组万事毕。
动手改
- 筛出"1班且成绩大于 80"的同学(条件用
&连接,两边加括号) - 把 groupby 里的
mean()换成max(),看看每个班的最高分 - 试试
df["成绩"].value_counts(),数一数每个分数出现的次数
下一章:实战,真刀真枪分析一份销售数据 🐸