Python 编程

pandas 入门:表格数据的主力工具

14 分钟

NumPy 擅长数值矩阵,但真实数据往往是带列名、混合类型、有缺失值的表格。这时候用 pandas。


两个核心结构

结构 是什么 类比
Series 带索引的一维数组 表格的一列
DataFrame 带行列标签的二维表 一整张 Excel 表
import pandas as pd

df = pd.DataFrame({
    "姓名": ["小明", "小红", "小刚"],
    "语文": [88, 95, 76],
    "数学": [92, 85, 90],
})

读数据:一行搞定

df = pd.read_csv("scores.csv")          # CSV
df = pd.read_excel("scores.xlsx")       # Excel
df = pd.read_json("data.json")          # JSON

中文 CSV 常见的坑

df = pd.read_csv("data.csv", encoding="utf-8")   # 报错就试 gbk

Windows 上导出的 CSV 常常是 gbk 编码,直接读会抛 UnicodeDecodeError


拿到数据先做的五件事

df.head()          # 前 5 行,看看长什么样
df.shape           # (行数, 列数)
df.info()          # 每列的类型和非空数量 —— 一眼看出缺失
df.describe()      # 数值列的统计:均值、标准差、四分位
df.isna().sum()    # 每列有多少缺失值

这五行是拿到任何数据集的标准动作,比急着画图有用得多。

df.info() 尤其重要——它同时告诉你两件事:哪列有缺失,以及哪列的类型不对(比如本该是数字的列被读成了 object,说明里面混了非数字内容)。


选数据:三种方式

df["语文"]                    # 单列 → Series
df[["姓名", "语文"]]          # 多列 → DataFrame(注意双层方括号)

df.loc[0]                     # 按标签取行
df.iloc[0]                    # 按位置取行
df.loc[0:2, ["姓名", "数学"]] # 行列一起取

lociloc 的区别是新手最容易混的

依据 切片是否含右端
loc 标签(索引名) 包含右端
iloc 位置(从 0 数) 不包含右端

df.loc[0:2] 返回 3 行df.iloc[0:2] 返回 2 行——这个差异经常导致「怎么少了一行」的困惑。


条件筛选:布尔索引

df[df["语文"] > 85]                          # 语文超过 85
df[(df["语文"] > 85) & (df["数学"] > 85)]    # 两科都超过
df[df["姓名"].isin(["小明", "小红"])]         # 在名单里

两个必须注意的点

  1. 多条件必须用 & |,不能用 and or(后者是对单个布尔值的运算,遇到数组会报错)
  2. 每个条件必须用括号包起来——因为 & 的优先级比 >

新增列与基本运算

df["总分"] = df["语文"] + df["数学"]
df["平均"] = df[["语文", "数学"]].mean(axis=1)   # axis=1 表示按行算
df = df.sort_values("总分", ascending=False)

axis 的记法axis=0 沿着行的方向(往下,对每列算);axis=1 沿着列的方向(往右,对每行算)。

练习:造一个含 5 个学生、3 门课的 DataFrame,筛选出「总分前三名且没有任何一科低于 60」的学生。

小纸条

拿到一份新数据该先跑哪五行代码?loc 和 iloc 的切片有什么关键区别?

登录 后可看答案