第19课 数据加载:CSV、Excel、数据库与 API
学习目标
完成本课学习后,你将能够:
- 使用 Pandas 库高效地从 CSV 和 Excel 文件中加载数据。
- 理解如何通过 SQL 查询从关系型数据库中提取数据到 DataFrame。
- 掌握通过 Python 的
requests库从 API 获取数据,并将其转换为结构化格式。 - 对加载后的数据进行基本的探索性查看(如前几行、数据类型、基本统计信息)。
核心概念
在机器学习和数据分析的世界里,第一步往往不是建立复杂的模型,而是将数据安全、正确地“搬运”到你的编程环境中。数据不会凭空出现,它们通常存储在各种地方:电脑里的表格文件(CSV/Excel)、公司的数据库,或者某个网站提供的 API 接口。Pandas,作为 Python 数据分析的“瑞士军刀”,为我们提供了强大而统一的接口来完成这项工作。
想象一下,你的数据是一个个等待被探索的岛屿,而加载数据就是建造通往这些岛屿的桥梁。选择正确的“桥梁”(加载方式)至关重要。
1. CSV (Comma-Separated Values) 这是最通用、最简单的数据格式。本质上是一个纯文本文件,每一行代表一条数据记录,字段之间通常用逗号分隔。它轻便、通用,几乎所有软件都能生成和读取它。
2. Excel (.xlsx, .xls) 这是职场中最常见的表格文件格式。它比 CSV 功能更强大,支持多个工作表(Sheet)、单元格格式、公式等。Pandas 也能轻松读取它。
3. 数据库 (SQL) 当数据量巨大、需要多人协作、或有复杂的查询需求时,数据会被存储在关系型数据库中(如 MySQL, PostgreSQL, SQLite)。我们需要使用 SQL(结构化查询语言)来告诉数据库我们需要哪一部分数据。
4. API (Application Programming Interface) 很多现代网络服务(如社交媒体、天气服务、金融数据提供商)通过 API 提供数据。你需要按照它规定的格式发送一个请求(Request),然后它会返回结构化的数据(通常是 JSON 格式)作为响应(Response)。
代码示例
让我们在代码中实际操作这四种加载方式。首先,请确保你已经安装了必要的库:pandas 和 requests(用于 API 请求)。你可以使用 pip install pandas requests 来安装。
# 导入必要的库
import pandas as pd
import requests
import json # 用于处理 API 返回的 JSON 数据
import sqlite3 # Python 内置的 SQLite 数据库接口
print("所有库导入成功!")
# ========== 1. 从 CSV 文件加载数据 ==========
# 假设我们有一个名为 'students_scores.csv' 的文件,内容如下:
# Name,Math,Science,English
# Alice,90,85,88
# Bob,78,92,80
# Charlie,95,88,82
# 实践中,你需要将数据保存到文件。这里我们用一个示例文件。
csv_file_path = 'students_scores.csv' # 替换为你的实际文件路径
try:
df_csv = pd.read_csv(csv_file_path)
print("成功从CSV加载数据!")
print("前3行数据:")
print(df_csv.head(3)) # 查看前几行,快速了解数据结构
print("\n数据基本信息:")
print(df_csv.info()) # 查看列名、数据类型、非空值数量
except FileNotFoundError:
print(f"错误:找不到文件 '{csv_file_path}'。请确保文件路径正确。")
except Exception as e:
print(f"读取CSV时发生错误: {e}")
# ========== 2. 从 Excel 文件加载数据 ==========
# 假设我们有一个 'sales_report.xlsx' 文件,里面有一个名为‘2023销售’的工作表。
excel_file_path = 'sales_report.xlsx'
sheet_name = '2023销售' # 可以指定工作表名称,默认是第一个
try:
df_excel = pd.read_excel(excel_file_path, sheet_name=sheet_name)
print("\n成功从Excel加载数据!")
print("数据形状 (行数, 列数):", df_excel.shape)
print("\n列名:", df_excel.columns.tolist())
except FileNotFoundError:
print(f"错误:找不到文件 '{excel_file_path}'。")
except Exception as e:
print(f"读取Excel时发生错误: {e}")
# ========== 3. 从 SQL 数据库加载数据 ==========
# 我们使用 Python 内置的 SQLite 创建一个临时内存数据库来演示
# 在实际场景中,你需要连接真实的数据库(如 MySQL),需要安装对应的驱动。
# 创建一个 SQLite 内存数据库和游标
conn = sqlite3.connect(':memory:') # ':memory:' 表示数据库只在内存中,程序结束就消失
cursor = conn.cursor()
# 创建一个表并插入一些示例数据
cursor.execute('''
CREATE TABLE employee (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
salary REAL
);
''')
cursor.executemany('INSERT INTO employee VALUES (?, ?, ?, ?)', [
(1, '张三', '技术部', 15000),
(2, '李四', '市场部', 12000),
(3, '王五', '技术部', 16000)
])
conn.commit() # 提交更改
# 使用 Pandas 的 read_sql_query 函数执行 SQL 查询并加载结果
sql_query = "SELECT * FROM employee WHERE department = '技术部';"
try:
df_sql = pd.read_sql_query(sql_query, conn)
print("\n成功从SQL数据库加载数据!")
print(df_sql)
except Exception as e:
print(f"执行SQL查询时发生错误: {e}")
finally:
conn.close() # 操作完成后关闭连接
# ========== 4. 从 API 加载数据 ==========
# 使用一个免费的公共 API 示例:获取一些随机的用户信息
# 注意:API 可能需要注册、认证(API Key)或有不同的调用限制。
api_url = "https://jsonplaceholder.typicode.com/users" # 一个用于测试的假API
try:
response = requests.get(api_url)
response.raise_for_status() # 如果请求失败(如404, 500),会抛出异常
# API 返回的是 JSON 格式的数据,它是一个列表,每个元素是一个用户字典
users_data = response.json()
# 将 JSON 数据(字典列表)直接转换为 Pandas DataFrame
df_api = pd.DataFrame(users_data)
print("\n成功从API加载数据!")
print(f"获取到 {len(df_api)} 个用户的信息。")
print("部分列名:", df_api.columns.tolist()[:5]) # 显示前5个列名
print("\n第一个用户的姓名和邮箱:")
print(df_api.loc[0, ['name', 'email']])
except requests.exceptions.RequestException as e:
print(f"API请求失败: {e}")
except json.JSONDecodeError:
print("API返回的数据不是有效的JSON格式。")
except Exception as e:
print(f"处理API数据时发生错误: {e}")
print("\n所有数据加载演示完成!")
实践练习
请根据以下要求完成练习。建议在一个新的 Python 脚本或 Jupyter Notebook 中尝试。
练习一:基础 CSV 加载
创建一个名为 products.csv 的文件,内容如下:
ProductID,Name,Price,Stock
101,Laptop,999.99,50
102,Keyboard,79.50,120
103,Monitor,349.00,85
104,Mouse,25.75,200
编写 Python 代码,使用 Pandas 读取该文件,并完成以下操作:
- 打印出整个 DataFrame。
- 打印出价格大于 100 的所有商品。
- 打印出
Stock列的数据类型。 预期输出:你会看到一个四行的表格,其中价格大于100的行只有 Laptop 和 Monitor。
练习二:处理 Excel 工作表
假设你有一个 Excel 文件 company_finances.xlsx,它包含两个工作表:“收入”和“支出”。
- 请分别读取这两个工作表到两个不同的 DataFrame(例如
df_income和df_expense)。 - 打印出每个 DataFrame 的形状(
shape)。 - (附加题)如果两个 DataFrame 有相同的“月份”列,尝试将它们按照“月份”合并(使用
pd.merge)。
练习三:API 数据探索
使用本课示例中的 API (https://jsonplaceholder.typicode.com/users),完成以下任务:
- 加载数据到
df_users。 - 找出所有
company.name中包含“Group”单词的用户(提示:你可以访问df_users['company']列,它是一个包含字典的列,可以用.apply()或直接访问嵌套结构)。 - 打印出这些用户的姓名(
name)和公司名(company.name)。
常见错误
- 文件路径错误:
FileNotFoundError。这是最常见的问题。确保字符串中的路径是正确的。在 Windows 上注意使用正斜杠/或双反斜杠\\,或者使用原始字符串r'C:\path\to\file.csv'。 - 编码问题:读取 CSV 或 Excel 时出现乱码。尝试在
read_csv或read_excel中指定编码,如encoding='gbk'(常见于中文Windows生成的文件) 或encoding='utf-8'。 - Excel 工作表不存在:指定了错误的
sheet_name。可以使用pd.ExcelFile('file.xlsx').sheet_names先查看所有工作表的名称。 - API 密钥泄露:不要在代码中硬编码敏感的 API 密钥。应该使用环境变量或安全的配置文件来存储。
- API 响应状态码非200:没有使用
response.raise_for_status()或检查response.status_code。直接对失败的响应调用.json()会报错。 - 数据库连接未关闭:在使用完数据库连接后,务必调用
conn.close(),或者使用with语句来自动管理资源,防止连接泄漏。
小结
本课我们学习了数据进入分析世界的四种主要“门户”:
- CSV/Excel:适用于本地、中小规模的静态数据文件。
pd.read_csv()和pd.read_excel()是你的基础工具。 - SQL 数据库:适用于大规模、需要复杂查询和多用户协作的数据。通过
pd.read_sql_query()执行 SQL。 - API:适用于获取实时或网络上的动态数据。流程是:
requests.get()-> 检查状态 ->.json()->pd.DataFrame()。
核心要点:
- 始终先用
head(),info(),shape等方法快速查看加载后的数据,确保它符合你的预期。 - 处理外部数据时,务必考虑错误处理(try-except),因为文件可能丢失、API 可能失效、网络可能中断。
- 了解你的数据来源和格式,是选择正确加载方式的第一步。
掌握了数据加载,你就像一个拥有了传送门的探险家,可以自由地前往各个数据岛屿进行探索了。准备好处理这些数据中可能存在的“坑”——比如缺失值了吗?那正是我们下一课的主题。