🐸 青蛙编程网
首页 / Python / Pandas / 4. 统计与筛选

统计与筛选

这是什么: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. 筛出"1班且成绩大于 80"的同学(条件用 & 连接,两边加括号)
  2. 把 groupby 里的 mean() 换成 max(),看看每个班的最高分
  3. 试试 df["成绩"].value_counts(),数一数每个分数出现的次数

下一章:实战,真刀真枪分析一份销售数据 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。