19·数据处理入门

数据加载:CSV、Excel、数据库与 API

datapandas

第19课 数据加载:CSV、Excel、数据库与 API

学习目标

完成本课学习后,你将能够:

  1. 使用 Pandas 库高效地从 CSV 和 Excel 文件中加载数据。
  2. 理解如何通过 SQL 查询从关系型数据库中提取数据到 DataFrame。
  3. 掌握通过 Python 的 requests 库从 API 获取数据,并将其转换为结构化格式。
  4. 对加载后的数据进行基本的探索性查看(如前几行、数据类型、基本统计信息)。

核心概念

在机器学习和数据分析的世界里,第一步往往不是建立复杂的模型,而是将数据安全、正确地“搬运”到你的编程环境中。数据不会凭空出现,它们通常存储在各种地方:电脑里的表格文件(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)。

代码示例

让我们在代码中实际操作这四种加载方式。首先,请确保你已经安装了必要的库:pandasrequests(用于 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 读取该文件,并完成以下操作:

  1. 打印出整个 DataFrame。
  2. 打印出价格大于 100 的所有商品。
  3. 打印出 Stock 列的数据类型。 预期输出:你会看到一个四行的表格,其中价格大于100的行只有 Laptop 和 Monitor。

练习二:处理 Excel 工作表 假设你有一个 Excel 文件 company_finances.xlsx,它包含两个工作表:“收入”和“支出”。

  1. 请分别读取这两个工作表到两个不同的 DataFrame(例如 df_incomedf_expense)。
  2. 打印出每个 DataFrame 的形状(shape)。
  3. (附加题)如果两个 DataFrame 有相同的“月份”列,尝试将它们按照“月份”合并(使用 pd.merge)。

练习三:API 数据探索 使用本课示例中的 API (https://jsonplaceholder.typicode.com/users),完成以下任务:

  1. 加载数据到 df_users
  2. 找出所有 company.name 中包含“Group”单词的用户(提示:你可以访问 df_users['company'] 列,它是一个包含字典的列,可以用 .apply() 或直接访问嵌套结构)。
  3. 打印出这些用户的姓名(name)和公司名(company.name)。

常见错误

  1. 文件路径错误FileNotFoundError。这是最常见的问题。确保字符串中的路径是正确的。在 Windows 上注意使用正斜杠 / 或双反斜杠 \\,或者使用原始字符串 r'C:\path\to\file.csv'
  2. 编码问题:读取 CSV 或 Excel 时出现乱码。尝试在 read_csvread_excel 中指定编码,如 encoding='gbk' (常见于中文Windows生成的文件) 或 encoding='utf-8'
  3. Excel 工作表不存在:指定了错误的 sheet_name。可以使用 pd.ExcelFile('file.xlsx').sheet_names 先查看所有工作表的名称。
  4. API 密钥泄露:不要在代码中硬编码敏感的 API 密钥。应该使用环境变量或安全的配置文件来存储。
  5. API 响应状态码非200:没有使用 response.raise_for_status() 或检查 response.status_code。直接对失败的响应调用 .json() 会报错。
  6. 数据库连接未关闭:在使用完数据库连接后,务必调用 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 可能失效、网络可能中断。
  • 了解你的数据来源和格式,是选择正确加载方式的第一步。

掌握了数据加载,你就像一个拥有了传送门的探险家,可以自由地前往各个数据岛屿进行探索了。准备好处理这些数据中可能存在的“坑”——比如缺失值了吗?那正是我们下一课的主题。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「缺失值处理:检测、填充与删除策略」 以巩固所学知识。