回顾一下,上篇博客我们学习了 Pandas 的核心数据结构 Series 和 DataFrame。 DataFrame 作为 Pandas 的 “王牌” 数据结构,是进行数据分析的基石。 但 DataFrame 的强大功能,还需要建立在 数据输入 (Input) 和 数据输出 (Output) 的基础上。 数据从哪里来? 分析结果又如何保存? 数据读取与写入 (Data I/O) 就是解决这些问题的关键环节。
数据 I/O 的重要性:连接数据与分析
在实际数据分析工作中,数据通常存储在各种 外部数据源 中,例如:
- CSV 文件 (Comma Separated Values): 最常用的表格数据存储格式之一,以纯文本存储,易于创建和共享。
- Excel 文件 (.xlsx, .xls): 电子表格软件 Excel 的文件格式,广泛应用于办公场景,包含工作表、公式、格式等。
- 文本文件 (.txt): 存储纯文本数据,例如日志文件、配置文件等。
- JSON 文件 (JavaScript Object Notation): 轻量级的数据交换格式,常用于 Web API 数据传输和配置文件。
- HTML 网页: 网页中的表格数据。
- SQL 数据库 (MySQL, PostgreSQL, SQL Server 等): 关系型数据库,用于存储和管理结构化数据。
- … 以及更多其他数据源。
我们需要将这些 外部数据源中的数据读取到 Pandas DataFrame 中,才能利用 Pandas 强大的数据分析功能进行后续处理和分析。 同样,数据分析的结果也需要 从 DataFrame 中导出到各种文件格式,以便生成报告、共享数据或进行持久化存储。
手动数据导入导出的痛点:低效且易错
对于不熟悉 Pandas 的朋友来说,手动导入导出数据可能是最常用的方式,例如:
- 手动复制粘贴数据: 从网页、文本文件或 Excel 文件中复制数据,然后粘贴到程序中 (例如 Python 列表、字典)。 这种方式 效率极低,容易出错,难以处理大量数据,且 无法自动化。
- 手动将分析结果复制粘贴到 Excel: 将程序分析结果复制粘贴到 Excel 表格中,生成报告。 同样 效率低下,容易出错,格式调整繁琐,且 无法自动化。
Pandas 数据 I/O:高效、便捷、自动化的数据交互
Pandas 提供了 强大且便捷的数据 I/O 功能,可以轻松地从各种数据源读取数据到 DataFrame,并将 DataFrame 数据导出到各种文件格式,实现 高效、便捷、自动化的数据交互:
- 代码简洁易用,操作简单高效: 使用 Pandas 提供的
read_*
函数 (例如pd.read_csv()
,pd.read_excel()
),几行代码就能读取各种文件格式的数据到 DataFrame。 使用df.to_*
方法 (例如df.to_csv()
,df.to_excel()
),几行代码就能将 DataFrame 数据导出到各种文件格式。 - 支持多种数据源和文件格式: Pandas 支持读取和写入多种常见的数据源和文件格式,包括 CSV, Excel, 文本文件, JSON, HTML, SQL 数据库等,满足各种数据分析场景的需求。
- 参数丰富灵活,定制化数据导入导出: Pandas 的数据 I/O 函数和方法提供了丰富的参数,可以灵活地控制数据导入导出的各种细节,例如分隔符、表头、索引、编码格式、数据类型、缺失值处理等,满足各种复杂的数据导入导出需求.
- 自动化数据处理流程的关键环节: Pandas 数据 I/O 功能是构建自动化数据分析流程的关键环节,可以实现数据自动导入、处理、分析、导出的全流程自动化,解放重复劳动,提高工作效率。
本篇博客将重点讲解 Pandas DataFrame 的 数据读取 (Input) 和 数据写入 (Output) 操作,让你掌握 Pandas 数据 I/O 的核心技能,轻松连接数据世界与 Pandas 数据分析利器,让数据在两者之间自由穿梭!
🔑 一、DataFrame 数据读取 (Input):从外部数据源加载数据
Pandas 提供了丰富的 read_*
函数,用于从各种外部数据源读取数据,并创建 DataFrame 对象。 常用的 read_*
函数包括:
1. pd.read_csv()
:读取 CSV 文件
pd.read_csv()
函数用于 读取 CSV (Comma Separated Values) 文件,并将数据加载到 DataFrame 对象中。 CSV 文件是最常用的表格数据存储格式之一。
pd.read_csv()
函数基本语法:
df = pd.read_csv(filepath_or_buffer, sep=',', header='infer', index_col=None, encoding=None, dtype=None, parse_dates=False, nrows=None)
常用参数说明 (常用参数):
filepath_or_buffer
(必需): 文件路径或文件型对象 (字符串或文件对象)。 指定要读取的 CSV 文件的路径。 可以是相对路径、绝对路径或 URL 路径。sep
(可选,默认为','
): 字段分隔符 (separator) (字符串),指定 CSV 文件中字段之间的分隔符,默认为逗号,
。 如果 CSV 文件使用其他分隔符 (例如制表符\t
、分号;
等),需要通过sep
参数指定。 例如,sep='\t'
表示制表符分隔,sep=';'
表示分号分隔。header
(可选,默认为'infer'
): 表头行 (header row),指定哪一行作为列索引 (表头)。header=0
: 将 CSV 文件的 第一行 作为列索引。header=None
: CSV 文件 没有表头行,Pandas 会自动创建默认的整数列索引 (0, 1, 2, …)。header=[0, 1]
: 将 CSV 文件的 多行 (例如第一行和第二行) 作为 多层索引 (MultiIndex) 的列索引。header='infer'
(默认值): 自动推断表头行,通常会将 CSV 文件的第一行作为表头行。
index_col
(可选,默认为None
): 索引列 (index column),指定哪一列作为行索引。index_col=0
: 将 CSV 文件的 第一列 作为行索引。index_col=[0, 1]
: 将 CSV 文件的 多列 (例如第一列和第二列) 作为 多层索引 (MultiIndex) 的行索引。index_col=None
(默认值): 不使用任何列作为行索引,Pandas 会自动创建默认的整数行索引 (0, 1, 2, …)。
encoding
(可选,默认为None
,通常建议设置为'utf-8'
): 文件编码格式 (encoding) (字符串),指定 CSV 文件的字符编码方式。 强烈建议在读取 CSV 文件时指定encoding='utf-8'
,以避免中文乱码问题。 常用的编码格式包括'utf-8'
、'gbk'
、'latin1'
等。dtype
(可选,默认为None
): 列数据类型 (data type) (字典或数据类型名称),指定 每列的数据类型。 例如,dtype={'年龄': 'int64', '销售额': 'float64'}
表示将 ‘年龄’ 列的数据类型设置为 64 位整数,‘销售额’ 列的数据类型设置为 64 位浮点数。 可以使用 Python 内置的数据类型名称 (例如int
,float
,str
,bool
) 或 NumPy 数据类型名称 (例如'int64'
,'float64'
,'object'
)。 如果不指定dtype
,Pandas 会 自动推断 每列的数据类型。parse_dates
(可选,默认为False
): 日期解析 (date parsing) (布尔值、列表或字典),指定是否 解析日期时间类型 的列。parse_dates=True
: 尝试解析所有列为日期时间类型。 Pandas 会自动识别常见的日期时间格式。parse_dates=['日期', '时间']
: 指定要解析为日期时间类型的列名列表。parse_dates={'时间戳': ['日期', '时间']}
: 将多列合并解析为一个日期时间列,例如将 ‘日期’ 列和 ‘时间’ 列合并解析为 ‘时间戳’ 列。
nrows
(可选,默认为None
): 读取行数 (number of rows) (整数),指定 读取 CSV 文件的行数 (从文件开头开始读取)。 如果只想读取文件的一部分数据 (例如文件的前几行),可以使用nrows
参数,提高读取大文件的效率。
示例 1:读取 CSV 文件 (默认参数)
假设我们有一个名为 data.csv
的 CSV 文件,内容如下 (逗号分隔,UTF-8 编码,包含表头行):
姓名,年龄,城市
Alice,25,北京
Bob,30,上海
Charlie,28,广州
Python 代码如下:
import pandas as pd
df = pd.read_csv("data.csv") # 使用默认参数读取 CSV 文件
print(df)
输出:
姓名 年龄 城市
0 Alice 25 北京
1 Bob 30 上海
2 Charlie 28 广州
示例 2:指定分隔符 sep
和编码格式 encoding
假设我们有一个名为 data_tab_separated.txt
的文本文件,内容如下 (制表符 \t
分隔,GBK 编码,包含表头行):
姓名 年龄 城市
Alice 25 北京
Bob 30 上海
Charlie 28 广州
Python 代码如下:
import pandas as pd
df = pd.read_csv("data_tab_separated.txt", sep='\t', encoding='gbk') # 指定分隔符为制表符,编码为 gbk
print(df)
输出结果与示例 1 相同。
示例 3:指定列索引 header
和行索引 index_col
假设我们有一个名为 data_no_header.csv
的 CSV 文件,内容如下 (逗号分隔,UTF-8 编码,没有表头行,第一列为姓名,需要作为行索引):
Alice,25,北京
Bob,30,上海
Charlie,28,广州
Python 代码如下:
import pandas as pd
df = pd.read_csv("data_no_header.csv", header=None, names=['姓名', '年龄', '城市'], index_col=0) # 指定没有表头行,自定义列名,指定第一列为行索引
print(df)
输出:
年龄 城市
姓名
Alice 25 北京
Bob 30 上海
Charlie 28 广州
代码解释:
header=None
: 指定 CSV 文件 没有表头行,Pandas 会自动创建默认的整数列索引 (0, 1, 2)。names=['姓名', '年龄', '城市']
: 使用names
参数 自定义列名,将默认的整数列索引替换为自定义的列名列表。index_col=0
: 指定 第一列 (位置索引为 0) 作为行索引,DataFrame 的行索引将使用 CSV 文件第一列的数据。
示例 4:指定数据类型 dtype
和日期解析 parse_dates
假设我们有一个名为 sales_data.csv
的 CSV 文件,内容如下 (逗号分隔,UTF-8 编码,包含