当前位置: 首页 > news >正文

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引擎,.xlsxlrd(注意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数据读写的核心原则

  1. 格式选择:小规模共享用CSV,大规模处理用Parquet/Feather,多表关联用Excel/SQL。
  2. 参数优化:善用dtypeusecolsparse_dates减少内存占用和后续转换工作。
  3. 性能意识:分块处理大文件,优化数据类型,避免重复读写相同数据。
  4. 兼容性考虑:注意编码、文件版本和缺失值处理,确保数据在不同系统间正确传递。

That’s all, thanks for reading~~
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

http://www.dtcms.com/a/276358.html

相关文章:

  • Can201-Introduction to Networking: Application Layer应用层
  • 深入解析 Stack 和 Queue:从原理到实战应用
  • 【读书笔记】从AI到Transformer:LLM技术演进全解析
  • 推荐系统-Random算法
  • jieba 库:中文分词的利器
  • 【Lucene/Elasticsearch】**Query Rewrite** 机制
  • day68—DFS—二叉树的所有路径(LeetCode-257)
  • 微信小程序form组件的使用
  • 从json中提取i18n字段
  • nodej获取当前系统的cpu架构信息
  • 程序员软技能之推广营销-04-长尾效应(Long Tail Effect)
  • UnityShader——SSAO
  • C++类模版1
  • Linux进程的生命周期:状态定义、转换与特殊场景
  • 【Elasticsearch】检索模板(Search Template)
  • 从输入到路径:AI赋能的地图语义解析与可视化探索之旅(2025空间智能全景)
  • C++ Boost 自动链接机制详解
  • Java基础:泛型
  • 单调栈单调队列【算法进阶】
  • 11. JVM中的分代回收
  • 数据结构自学Day6 栈与队列
  • BaseDao 通用查询方法设计与实现
  • 快速过一遍Python基础语法
  • 015---全面理解交易:区块链状态转移的原子单位与链上执行全流程图解
  • 【AI News | 20250711】每日AI进展
  • APP Inventor使用指南
  • LeetCode 3169.无需开会的工作日:排序+一次遍历——不需要正难则反,因为正着根本不难
  • 【使用Pyqt designer时pyside2安装失败】
  • 如何彻底禁用 Chrome 自动更新
  • C++实现二叉树左右子树交换算法