Pandas-数据加载与保存
Pandas数据加载与保存全指南-轻松搞定数据输入输出
- 一、数据加载:从外部来源读取数据
- 1. 文本文件:CSV与TSV
- 基础用法
- 核心参数详解
- 2. 电子表格:Excel文件
- 基础用法
- 进阶参数
- 3. 结构化数据:JSON与SQL
- JSON文件
- SQL数据库
- 二、数据保存:将DataFrame写入外部文件
- 1. 保存为CSV/TSV
- 2. 保存为Excel文件
- 3. 高性能格式:Parquet与Feather
- 4. 保存为SQL数据库
- 三、性能优化与最佳实践
- 1. 大型文件处理技巧
- 2. 数据类型优化
- 3. 避免常见陷阱
- 四、应用实例:完整数据处理流
Pandas作为Python数据处理的核心库,提供了丰富的API用于读取和写入各种格式的数据,从常见的CSV、Excel到专业的SQL、Parquet文件,几乎覆盖了所有主流数据存储格式。本文我将系统讲解Pandas中数据加载与保存的核心方法,并结合实例详解参数配置与性能优化,带你高效处理数据输入输出。
一、数据加载:从外部来源读取数据
Pandas的read_*
系列函数是加载数据的主力,不同格式对应不同函数,但其核心参数(如列选择、类型转换)具有高度一致性,掌握这些共性规律能显著提升学习效率。
1. 文本文件:CSV与TSV
CSV(逗号分隔值)和TSV(制表符分隔值)是最常用的文本数据格式,Pandas通过read_csv()
函数读取,支持丰富的解析配置。
基础用法
import pandas as pd# 读取CSV文件
df = pd.read_csv('data.csv')
# 读取TSV文件(指定分隔符为制表符)
df_tsv = pd.read_csv('data.tsv', sep='\t')
核心参数详解
sep
:指定分隔符,默认,
,TSV需设为'\t'
,不规则分隔符可用正则(如'\s+'
匹配任意空白)。header
:指定表头行索引,默认0
(第一行为表头),无表头时设为None
,需手动指定names=['col1', 'col2']
。# 无表头数据,手动指定列名 df = pd.read_csv('no_header.csv', header=None, names=['id', 'name', 'value'])
usecols
:选择需要加载的列,减少内存占用:# 只加载'id'和'value'列 df = pd.read_csv('data.csv', usecols=['id', 'value'])
dtype
:指定列的数据类型,避免自动推断错误(如将数字型ID识别为整数):# 将'id'设为字符串(避免大整数溢出),'value'设为浮点数 df = pd.read_csv('data.csv', dtype={'id': str, 'value': float})
parse_dates
:自动解析日期列,无需后续转换:# 解析'date'列为 datetime 类型 df = pd.read_csv('data.csv', parse_dates=['date'])
na_values
:自定义缺失值标识(如'N/A'
、'-'
):df = pd.read_csv('data.csv', na_values=['N/A', '-'])
2. 电子表格:Excel文件
处理Excel文件需安装openpyxl
(读取xlsx)或xlrd
(读取xls)库,Pandas通过read_excel()
函数操作,支持多工作表读取。
基础用法
# 读取Excel文件(默认第一张工作表)
df = pd.read_excel('data.xlsx')# 读取指定工作表(通过名称或索引)
df_sheet2 = pd.read_excel('data.xlsx', sheet_name='Sheet2') # 按名称
df_sheet3 = pd.read_excel('data.xlsx', sheet_name=2) # 按索引(从0开始)
进阶参数
skiprows
:跳过指定行数(如跳过表头前的说明文字):# 跳过前3行 df = pd.read_excel('data.xlsx', skiprows=3)
header
:指定表头位置(与skiprows
功能互补):# 第5行为表头(索引从0开始) df = pd.read_excel('data.xlsx', header=4)
usecols
:选择列(支持Excel列名如'A:C'
或列索引[0,1,2]
):df = pd.read_excel('data.xlsx', usecols='A:C') # 读取A到C列
3. 结构化数据:JSON与SQL
JSON文件
JSON格式灵活但结构可能嵌套,read_json()
支持自动解析扁平JSON,复杂嵌套需配合orient
参数:
# 读取扁平JSON(键为列名,值为数组)
df = pd.read_json('data.json')# 读取按记录组织的JSON(如[{"id":1}, {"id":2}])
df = pd.read_json('records.json', orient='records')
SQL数据库
通过read_sql()
函数连接数据库读取数据,需配合sqlalchemy
创建引擎:
from sqlalchemy import create_engine# 连接SQLite数据库(其他数据库需修改连接字符串)
engine = create_engine('sqlite:///mydb.db')# 读取表数据
df = pd.read_sql('table_name', engine)# 执行SQL查询
df = pd.read_sql('SELECT id, name FROM table WHERE value > 100', engine)
二、数据保存:将DataFrame写入外部文件
处理完的数据需保存为便于共享或后续分析的格式,Pandas的to_*
系列函数与read_*
函数对应,支持相同格式的写入操作。
1. 保存为CSV/TSV
to_csv()
是最常用的保存方法,支持自定义分隔符、缺失值处理等:
# 保存为CSV(默认逗号分隔)
df.to_csv('output.csv', index=False) # index=False 不保存索引列# 保存为TSV(制表符分隔)
df.to_csv('output.tsv', sep='\t', index=False)# 处理缺失值(用'NA'代替默认的空字符串)
df.to_csv('output.csv', na_rep='NA', index=False)# 只保存指定列
df.to_csv('output.csv', columns=['id', 'name', 'value'], index=False)
2. 保存为Excel文件
to_excel()
支持写入多工作表,需注意避免重复打开文件:
# 创建ExcelWriter对象(支持写入多工作表)
with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1', index=False)df2.to_excel(writer, sheet_name='Sheet2', index=False)# 自定义表头样式(需xlsxwriter库)
writer = pd.ExcelWriter('styled_output.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Data', index=False)
worksheet = writer.sheets['Data']
header_format = writer.book.add_format({'bold': True, 'bg_color': '#FFFF00'})
for col_num, value in enumerate(df.columns.values):worksheet.write(0, col_num, value, header_format)
writer.close()
3. 高性能格式:Parquet与Feather
对于大规模数据,Parquet和Feather等列式存储格式具有更高的读写效率和压缩比,是数据科学中的优选:
# 保存为Parquet(需pyarrow库)
df.to_parquet('output.parquet', index=False)
# 读取Parquet
df = pd.read_parquet('output.parquet')# 保存为Feather(需pyarrow库)
df.to_feather('output.feather')
# 读取Feather
df = pd.read_feather('output.feather')
- 优势:读写速度比CSV快10-100倍,文件体积更小,保留数据类型元信息。
- 适用场景:中间结果存储、大规模数据集共享。
4. 保存为SQL数据库
to_sql()
可将DataFrame直接写入数据库表:
# 写入SQL表(若表不存在则创建)
df.to_sql('new_table', engine, if_exists='replace', index=False)
# if_exists参数:'fail'(默认,表存在则报错)、'replace'(替换)、'append'(追加)
三、性能优化与最佳实践
1. 大型文件处理技巧
- 分块读取:对于GB级大文件,使用
chunksize
参数分块加载:# 每次读取1000行 chunk_iter = pd.read_csv('large_data.csv', chunksize=1000) for chunk in chunk_iter:# 逐块处理(如过滤、聚合)processed_chunk = chunk[chunk['value'] > 100]
- 选择合适格式:优先使用Parquet/Feather而非CSV,尤其对于重复读取的场景:
# 首次处理后保存为Parquet df.to_parquet('large_data.parquet') # 后续读取时速度提升显著 df = pd.read_parquet('large_data.parquet')
2. 数据类型优化
保存前优化数据类型可减小文件体积,提升读写速度:
# 将字符串ID转为类别型(适用于重复值多的列)
df['category'] = df['category'].astype('category')# 缩小数值类型(如int64→int32,float64→float32)
df['value'] = pd.to_numeric(df['value'], downcast='float')
3. 避免常见陷阱
- 索引列问题:读取时注意
index_col
参数,保存时用index=False
避免多余索引列。 - 编码问题:读取非UTF-8编码的文件需指定
encoding
参数(如encoding='gbk'
处理中文Windows文件)。 - Excel版本兼容:
.xlsx
格式需openpyxl
引擎,.xls
需xlrd
(注意xlrd 2.0+不支持xls格式)。
四、应用实例:完整数据处理流
# 1. 读取数据(处理缺失值、指定类型)
df = pd.read_csv('sales_data.csv',sep=',',header=0,usecols=['order_id', 'product', 'amount', 'order_date'],dtype={'order_id': str, 'amount': float},parse_dates=['order_date'],na_values=['N/A', '']
)# 2. 数据清洗与处理
df = df.dropna(subset=['amount']) # 删除金额缺失的行
df['amount'] = df['amount'].round(2) # 金额保留两位小数
df['month'] = df['order_date'].dt.to_period('M') # 提取月份# 3. 数据分析(按月聚合)
monthly_sales = df.groupby('month')['amount'].sum().reset_index()# 4. 保存结果(多格式备份)
monthly_sales.to_csv('monthly_sales.csv', index=False) # 便于查看
monthly_sales.to_parquet('monthly_sales.parquet') # 便于后续快速读取
with pd.ExcelWriter('sales_report.xlsx') as writer:df.to_excel(writer, sheet_name='Raw Data', index=False)monthly_sales.to_excel(writer, sheet_name='Monthly Summary', index=False)
总结:Pandas数据读写的核心原则
- 格式选择:小规模共享用CSV,大规模处理用Parquet/Feather,多表关联用Excel/SQL。
- 参数优化:善用
dtype
、usecols
、parse_dates
减少内存占用和后续转换工作。- 性能意识:分块处理大文件,优化数据类型,避免重复读写相同数据。
- 兼容性考虑:注意编码、文件版本和缺失值处理,确保数据在不同系统间正确传递。
That’s all, thanks for reading~~
觉得有用就点个赞
、收进收藏
夹吧!关注
我,获取更多干货~