NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

11.3 与其他库的数据交互

NumPy高级教程:与Pandas、CSV、Excel和数据库的数据交互完全指南

NumPy 中文教程

本教程深入讲解NumPy如何与Pandas库进行数组与DataFrame/Series之间的高效转换,以及如何通过CSV、Excel文件和数据库(MySQL/PostgreSQL)进行数据读写,适合新人和高级用户,提升数据处理技能。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy与其他库的数据交互教程

简介

NumPy是Python中用于科学计算的核心库,提供强大的多维数组对象和数学函数。在实际项目中,NumPy经常需要与其他数据源交互,如Pandas处理表格数据、CSV/Excel文件存储或数据库管理系统。本教程将详细讲解这些交互方式,帮助新人轻松上手。


1. NumPy ↔ Pandas(数组 ↔ DataFrame/Series)

Pandas是基于NumPy构建的数据分析库,常用于处理表格数据。NumPy与Pandas之间的数据转换非常常见,可以无缝交换。

1.1 NumPy数组转换为Pandas DataFrame/Series

Pandas提供了简单的方法将NumPy数组转换为DataFrame(多列数据表)或Series(单列数据)。

代码示例:将NumPy数组转换为DataFrame和Series

import numpy as np
import pandas as pd

# 创建一个2D NumPy数组
np_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("NumPy数组:")
print(np_array)

# 转换为Pandas DataFrame
df = pd.DataFrame(np_array, columns=['A', 'B', 'C'])
print("\nPandas DataFrame:")
print(df)

# 创建一个1D NumPy数组
np_series_array = np.array([10, 20, 30])
# 转换为Pandas Series
series = pd.Series(np_series_array, name='Values')
print("\nPandas Series:")
print(series)

解释:DataFrame适合多列数据,Series适合单列数据。转换时可以使用列名、行标签等参数自定义。

1.2 Pandas DataFrame/Series转换为NumPy数组

反之,Pandas对象可以轻松转换为NumPy数组进行处理。

代码示例:将DataFrame和Series转换为NumPy数组

# 从Pandas DataFrame转换为NumPy数组
np_from_df = df.values  # 或者使用 df.to_numpy()
print("从DataFrame转换的NumPy数组:")
print(np_from_df)

# 从Pandas Series转换为NumPy数组
np_from_series = series.values  # 或者使用 series.to_numpy()
print("\n从Series转换的NumPy数组:")
print(np_from_series)

解释.values是旧方法,.to_numpy()是推荐的方法,更高效且兼容性好。

1.3 注意事项

  • 数据类型:转换时NumPy数组和Pandas对象共享数据,但需要注意dtype,确保数据一致性。
  • 性能:Pandas基于NumPy,转换通常很快,但大数据集时考虑内存使用。

2. NumPy ↔ CSV/Excel(间接读写)

NumPy本身不直接支持CSV或Excel读写,但可以通过其他库(如Pandas)实现间接交互,这是常见的实践。

2.1 使用Pandas读写CSV/Excel文件

Pandas提供了便捷的函数处理CSV和Excel文件,我们可以先用NumPy处理数组,再用Pandas保存。

代码示例:通过Pandas保存和读取数据为NumPy数组

# 创建一个NumPy数组
np_data = np.random.rand(5, 3)  # 5行3列的随机数
print("原始NumPy数组:")
print(np_data)

# 保存为CSV文件
# 先转换为DataFrame
df_to_save = pd.DataFrame(np_data, columns=['X', 'Y', 'Z'])
df_to_save.to_csv('data.csv', index=False)  # index=False避免保存索引
print("\n数据已保存为CSV文件: data.csv")

# 从CSV文件读取数据,再转换为NumPy数组
df_from_csv = pd.read_csv('data.csv')
np_from_csv = df_from_csv.to_numpy()
print("\n从CSV读取的NumPy数组:")
print(np_from_csv)

# 类似地,保存和读取Excel文件(需要安装openpyxl或xlrd库)
# df_to_save.to_excel('data.xlsx', index=False)
# df_from_excel = pd.read_excel('data.xlsx')
# np_from_excel = df_from_excel.to_numpy()

解释:这种方法结合了Pandas的文件处理能力和NumPy的数组计算优势。

2.2 使用NumPy的内置函数(限于简单CSV)

对于简单CSV,NumPy有numpy.genfromtxtnumpy.savetxt,但功能有限。

代码示例:NumPy直接读写CSV

# 保存NumPy数组为CSV
np.savetxt('np_data.csv', np_data, delimiter=',', fmt='%f')  # fmt指定格式
print("\n使用NumPy保存为CSV: np_data.csv")

# 从CSV读取到NumPy数组
np_load = np.genfromtxt('np_data.csv', delimiter=',')
print("\n使用NumPy从CSV读取的数组:")
print(np_load)

解释:这种方法适合简单的数值数据,但缺乏Pandas的灵活性,如处理缺失值或复杂结构。


3. NumPy ↔ 数据库(MySQL/PostgreSQL)

NumPy与数据库交互通常通过SQLAlchemy等ORM库或直接数据库连接库(如pymysql、psycopg2)实现。

3.1 使用SQLAlchemy和Pandas进行交互

SQLAlchemy是Python的SQL工具包,结合Pandas可以方便地将数据库数据转换为NumPy数组。

代码示例:连接到MySQL数据库并读写数据

from sqlalchemy import create_engine
import pandas as pd

# 创建数据库连接引擎(以MySQL为例,需要安装pymysql)
# 格式:数据库类型://用户名:密码@主机:端口/数据库名
db_engine = create_engine('mysql+pymysql://user:password@localhost:3306/testdb')

# 创建一个NumPy数组并保存到数据库
np_to_db = np.array([[1, 'Alice', 25], [2, 'Bob', 30]])
df_to_db = pd.DataFrame(np_to_db, columns=['id', 'name', 'age'])
# 将DataFrame写入数据库表
df_to_db.to_sql('users', con=db_engine, if_exists='replace', index=False)
print("NumPy数组已保存到数据库表 'users'")

# 从数据库读取数据到NumPy数组
df_from_db = pd.read_sql('SELECT * FROM users', con=db_engine)
np_from_db = df_from_db.to_numpy()
print("\n从数据库读取的NumPy数组:")
print(np_from_db)

解释:类似地,适用于PostgreSQL,只需更改连接字符串(如使用'postgresql+psycopg2://')。

3.2 直接使用数据库连接库

如果不使用Pandas,可以直接用数据库库,但更复杂。

代码示例:使用pymysql直接交互

import pymysql

# 连接MySQL数据库
connection = pymysql.connect(host='localhost', user='user', password='password', database='testdb')
cursor = connection.cursor()

# 创建一个NumPy数组
np_data_db = np.array([[3, 'Charlie', 35]])
# 插入数据
for row in np_data_db:
    cursor.execute("INSERT INTO users (id, name, age) VALUES (%s, %s, %s)", row)
connection.commit()
print("数据已插入到数据库")

# 查询数据到NumPy数组
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()  # 获取所有行作为元组列表
np_query = np.array(rows)  # 转换为NumPy数组
print("\n查询的NumPy数组:")
print(np_query)

cursor.close()
connection.close()

解释:这种方法更底层,但给了更多控制权,适合高级用户。

3.3 最佳实践

  • 使用Pandas和SQLAlchemy:简化流程,处理大型数据集时性能好。
  • 数据类型映射:确保数据库字段类型与NumPy dtype匹配。
  • 错误处理:添加异常处理以应对连接问题。

结论

NumPy与其他库的数据交互是现代数据科学工作流的核心部分。通过本教程,你应该能够:

  • 轻松转换NumPy数组与Pandas DataFrame/Series。
  • 使用Pandas或NumPy内置函数间接读写CSV/Excel文件。
  • 连接数据库(如MySQL/PostgreSQL)进行数据交换。

练习建议:动手运行代码示例,并根据自己需求调整参数。NumPy的灵活性和Pandas的强大功能将帮助你高效处理各种数据任务。

如果你有更多问题,欢迎继续学习NumPy官方文档或相关社区资源!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包