Day 37:Pandas 数据读取------从各种来源加载数据
昨天手动创建了 DataFrame。现实中数据通常来自文件。今天学如何从 CSV、Excel、JSON、数据库等各类数据源中读取数据到 DataFrame。
一、读取 CSV------最常用的数据源
python
import pandas as pd
# 基本读取
df = pd.read_csv("data.csv")
# 常用参数一览
df = pd.read_csv(
"data.csv",
encoding="utf-8", # 编码
sep=",", # 分隔符(默认逗号)
header=0, # 第几行作为列名(0=第一行)
index_col=0, # 把第几列作为行索引
usecols=["姓名", "成绩"], # 只读取指定列
nrows=100, # 只读前100行
skiprows=2, # 跳过前2行
dtype={"年龄": int}, # 指定列的数据类型
na_values=["NA", "缺失"], # 把指定值当作 NaN
)
print(df.head()) # 前5行
print(df.tail(3)) # 后3行
实战:读取真实数据集
python
# 读取一个典型的 CSV
df = pd.read_csv("students.csv", encoding="utf-8")
print(f"形状:{df.shape}")
print(f"列名:{list(df.columns)}")
print(f"每列类型:\n{df.dtypes}")
print(f"\n前3行:\n{df.head(3)}")
处理中文乱码
python
# 尝试顺序:utf-8 → gbk → gb2312 → gb18030
encodings = ["utf-8", "utf-8-sig", "gbk", "gb2312", "gb18030", "latin-1"]
for enc in encodings:
try:
df = pd.read_csv("data.csv", encoding=enc)
print(f"成功用 {enc} 编码读取")
break
except UnicodeDecodeError:
print(f"{enc} 失败,尝试下一个...")
continue
二、写入 CSV
python
df.to_csv(
"output.csv",
index=False, # 不保存行索引
encoding="utf-8-sig", # utf-8-sig 让 Excel 能正确打开中文
sep=",",
columns=["姓名", "成绩"], # 只保存指定列
)
为什么用 utf-8-sig 而不是 utf-8?
utf-8:标准编码,但 Excel 打开时中文会乱码utf-8-sig:在文件头加 BOM,Excel 能正确识别中文
三、读取 Excel
python
# 先安装:pip install openpyxl
# 读取 Excel
df = pd.read_excel(
"data.xlsx",
sheet_name="Sheet1", # 工作表名(或索引 0)
header=1, # 第2行作为列名
usecols="A:D", # 只读 A-D 列
nrows=50,
)
# 读取所有工作表
all_sheets = pd.read_excel("data.xlsx", sheet_name=None)
for name, sheet_df in all_sheets.items():
print(f"工作表 '{name}':{sheet_df.shape}")
# 写入 Excel
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="学生成绩", index=False)
df.to_excel(writer, sheet_name="备份", index=False)
四、读取 JSON
python
# 读取 JSON 文件
df = pd.read_json("data.json")
print(df)
# 读取嵌套 JSON(带结构的)
import json
with open("api_data.json", "r", encoding="utf-8") as f:
data = json.load(f)
# 用 json_normalize 展平嵌套结构
df = pd.json_normalize(
data,
record_path=["results"], # 记录所在的路径
meta=["page", "total"] # 保留的元数据字段
)
五、其他数据源速览
python
# SQL 数据库(需要 pip install sqlalchemy + 数据库驱动)
from sqlalchemy import create_engine
engine = create_engine("sqlite:///database.db")
df = pd.read_sql("SELECT * FROM students WHERE score > 80", engine)
# HTML 网页中的表格
tables = pd.read_html("https://example.com/data-table.html")
df = tables[0] # 第一个 <table> 标签
# 剪贴板(复制表格后直接在 Python 中读取)
df = pd.read_clipboard() # 从剪贴板读取!
# 字典/列表直接转 DataFrame
data = [
{"name": "小明", "score": 85},
{"name": "小红", "score": 92},
]
df = pd.DataFrame(data)
# NumPy 数组转 DataFrame
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
df = pd.DataFrame(arr, columns=["A", "B", "C"])
六、了解你的数据------读取后的第一步
python
df = pd.read_csv("data.csv", encoding="utf-8")
# 第一件事:概览
print(f"行数:{len(df)},列数:{len(df.columns)}")
print(f"列名:{list(df.columns)}")
# 查看前几行和后几行
print(df.head())
print(df.tail())
# 查看基本统计
print(df.describe()) # 数值列统计
print(df.describe(include="all")) # 包含非数值列
# 查看缺失值
print(df.isnull().sum()) # 每列有多少缺失值
# 查看每列的唯一值数量
print(df.nunique())
七、实战:加载并初步探索一个数据集
python
# 创建一个模拟数据集然后探索
import pandas as pd
import numpy as np
np.random.seed(42)
# 模拟网上商店订单数据
n = 1000
df = pd.DataFrame({
"order_id": range(1001, 1001 + n),
"customer": np.random.choice(["张三", "李四", "王五", "赵六"], n),
"product": np.random.choice(["手机", "电脑", "平板", "耳机", "手表"], n),
"price": np.random.uniform(50, 5000, n).round(2),
"quantity": np.random.randint(1, 5, n),
"date": pd.date_range("2026-01-01", periods=n, freq="h"),
})
# 保存为 CSV
df.to_csv("orders.csv", index=False, encoding="utf-8-sig")
# 重新加载并探索
orders = pd.read_csv("orders.csv", encoding="utf-8-sig",
parse_dates=["date"]) # 自动解析日期列
print(f"数据集:{orders.shape[0]} 条订单,{orders.shape[1]} 列")
print(f"日期范围:{orders['date'].min()} ~ {orders['date'].max()}")
print(f"总销售额:{orders['price'].sum():,.2f}")
print(f"每单均价:{orders['price'].mean():.2f}")
八、今日学习总结
| 学习内容 | 掌握情况 | 一句话要点 |
|---|---|---|
| pd.read_csv() | ✅ 重点 | CSV 是最常用的数据来源 |
| 编码处理 | ✅ 重点 | utf-8 不行试 gbk,写文件用 utf-8-sig |
| pd.read_excel() | ✅ 了解 | 需要 openpyxl |
| pd.read_json() | ✅ 了解 | JSON 转 DataFrame |
| 数据概览 | ✅ 重点 | head/info/describe/isnull/sum/nunique |
| 其他数据源 | ✅ 了解 | SQL/HTML/剪贴板/NumPy |
今日踩坑记录
- CSV 第一列变成乱码 :存了 utf-8 但带 BOM 头。用
encoding="utf-8-sig"读取。 - 大文件 read_csv 太慢 :用
nrows=100先看前100行,确定列名和类型,再用dtype指定类型能快很多。 - 日期列被当成字符串 :
read_csv默认不解析日期。用parse_dates=["date_column"]参数。
九、明天学什么?
学会了读取数据,明天学 Pandas 的核心技能------数据清洗:处理缺失值、重复值、类型转换、异常值。
数据科学 80% 的时间在清洗数据。Pandas 让这个过程从"痛苦"变成"顺手"。
第37天,打卡完成。明天见!
本系列是个人学习笔记,如有错误欢迎在评论区指正交流。