day-037-Pandas数据读取

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

今日踩坑记录

  1. CSV 第一列变成乱码 :存了 utf-8 但带 BOM 头。用 encoding="utf-8-sig" 读取。
  2. 大文件 read_csv 太慢 :用 nrows=100 先看前100行,确定列名和类型,再用 dtype 指定类型能快很多。
  3. 日期列被当成字符串read_csv 默认不解析日期。用 parse_dates=["date_column"] 参数。

九、明天学什么?

学会了读取数据,明天学 Pandas 的核心技能------数据清洗:处理缺失值、重复值、类型转换、异常值。


数据科学 80% 的时间在清洗数据。Pandas 让这个过程从"痛苦"变成"顺手"。
第37天,打卡完成。明天见!


本系列是个人学习笔记,如有错误欢迎在评论区指正交流。

相关推荐
benchmark_cc1 天前
如何用 Python 进行多周期 K 线合成与时区对齐?基于 QuantDash 与 Pandas 的量化数据清洗实战(附 GitHub 源码)
开发语言·python·github·盯盘·pandas·quantdash·量化数据
梅雅达编程笔记3 天前
零基础学 Python 第14章 | 模块、包与第三方库
开发语言·python·django·numpy·pandas
梅雅达编程笔记3 天前
零基础学 Python 第15章 | 类与对象:面向对象编程入门
开发语言·python·django·numpy·pandas
benchmark_cc3 天前
Python 量化核心基础:前复权、后复权与不复权有什么区别?基于 QuantDash 的数据处理与回测避坑指南
开发语言·python·pandas·量化策略·量化交易·quantdash
人工干智能4 天前
科普:Pandas 索引器 loc 与 iloc 的编程思维
java·人工智能·pandas
梅雅达编程笔记4 天前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
benchmark_cc4 天前
用 Streamlit + QuantDash 10分钟拼装一个跨市场持仓风险与相关性诊断面板
开发语言·python·pandas·量化策略·量化交易·quantdash
benchmark_cc5 天前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
weixin_307779137 天前
Python Pandas读取Excel Sheet生成SQL WHERE条件
python·sql·自动化·excel·pandas