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, ["姓名", "数学"]] # 行列一起取
loc 和 iloc 的区别是新手最容易混的:
| 依据 | 切片是否含右端 | |
|---|---|---|
| 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(["小明", "小红"])] # 在名单里
两个必须注意的点:
- 多条件必须用
&|,不能用andor(后者是对单个布尔值的运算,遇到数组会报错) - 每个条件必须用括号包起来——因为
&的优先级比>高
新增列与基本运算
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 的切片有什么关键区别?
登录 后可看答案