简体中文 繁體中文 English Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français Japanese

站内搜索

搜索

活动公告

通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31

使用pandas轻松实现多种格式文件的读取与写入操作从CSV到Excel全面掌握数据处理必备技能

SunJu_FaceMall

3万

主题

166

科技点

3万

积分

大区版主

碾压王

积分
32106
发表于 2025-8-27 10:00:00 | 显示全部楼层 |阅读模式 [标记阅至此楼]

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在数据科学和分析领域,文件读取与写入是数据处理流程中不可或缺的基础环节。Python的pandas库作为数据分析的核心工具,提供了强大而灵活的文件I/O功能,使数据科学家能够轻松处理各种格式的数据文件。无论是简单的CSV文件,还是复杂的Excel工作簿,pandas都能提供简洁高效的解决方案。本文将全面介绍如何使用pandas实现多种格式文件的读取与写入操作,帮助您掌握这一数据处理必备技能,提高工作效率。

CSV文件操作

CSV(Comma-Separated Values,逗号分隔值)是最常见的数据交换格式之一,因其简单性和通用性被广泛使用。pandas提供了read_csv()和to_csv()两个核心函数来处理CSV文件。

读取CSV文件

使用pd.read_csv()函数可以轻松读取CSV文件:
  1. import pandas as pd
  2. # 基本读取
  3. df = pd.read_csv('data.csv')
  4. # 查看前5行数据
  5. print(df.head())
复制代码

read_csv()函数提供了丰富的参数来应对各种情况:
  1. # 指定分隔符(默认为逗号)
  2. df = pd.read_csv('data.tsv', sep='\t')  # 读取TSV文件
  3. # 指定编码(处理中文等非ASCII字符)
  4. df = pd.read_csv('data.csv', encoding='utf-8')
  5. df = pd.read_csv('data.csv', encoding='gbk')  # 中文Windows常用编码
  6. # 指定列名
  7. df = pd.read_csv('data.csv', names=['列1', '列2', '列3'])  # 自定义列名
  8. df = pd.read_csv('data.csv', header=0)  # 使用第一行作为列名(默认)
  9. df = pd.read_csv('data.csv', header=None)  # 没有列名
  10. # 指定索引列
  11. df = pd.read_csv('data.csv', index_col='id')  # 使用'id'列作为索引
  12. df = pd.read_csv('data.csv', index_col=0)  # 使用第一列作为索引
  13. # 只读取部分列
  14. df = pd.read_csv('data.csv', usecols=['列1', '列3'])  # 只读取指定列
  15. df = pd.read_csv('data.csv', usecols=[0, 2])  # 只读取第1和第3列
  16. # 跳过行
  17. df = pd.read_csv('data.csv', skiprows=2)  # 跳过前2行
  18. df = pd.read_csv('data.csv', skiprows=[1, 3])  # 跳过第2和第4行
  19. # 处理缺失值
  20. df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', 'NaN'])  # 指定哪些值视为缺失值
  21. # 指定数据类型
  22. df = pd.read_csv('data.csv', dtype={'列1': 'int64', '列2': 'float64'})
  23. # 解析日期
  24. df = pd.read_csv('data.csv', parse_dates=['日期列'])  # 将指定列解析为日期
  25. df = pd.read_csv('data.csv', parse_dates=True)  # 尝试解析所有可能的日期列
  26. # 处理大文件 - 分块读取
  27. chunk_iter = pd.read_csv('large_data.csv', chunksize=10000)  # 每次读取10000行
  28. for chunk in chunk_iter:
  29.     process(chunk)  # 处理每个数据块
复制代码

写入CSV文件

使用DataFrame的to_csv()方法可以将数据写入CSV文件:
  1. import pandas as pd
  2. # 创建一个示例DataFrame
  3. data = {
  4.     '姓名': ['张三', '李四', '王五'],
  5.     '年龄': [25, 30, 35],
  6.     '城市': ['北京', '上海', '广州']
  7. }
  8. df = pd.DataFrame(data)
  9. # 基本写入
  10. df.to_csv('output.csv')
  11. # 不写入索引
  12. df.to_csv('output.csv', index=False)
  13. # 指定分隔符
  14. df.to_csv('output.tsv', sep='\t')  # 写入为TSV文件
  15. # 指定编码
  16. df.to_csv('output.csv', encoding='utf-8')
  17. df.to_csv('output.csv', encoding='gbk')  # 中文Windows常用编码
  18. # 处理缺失值表示
  19. df.to_csv('output.csv', na_rep='NULL')  # 将缺失值表示为'NULL'
  20. # 只写入部分列
  21. df.to_csv('output.csv', columns=['姓名', '城市'])
  22. # 指定浮点数格式
  23. df['浮点数列'] = [3.1415926, 2.7182818, 1.4142135]
  24. df.to_csv('output.csv', float_format='%.2f')  # 保留两位小数
  25. # 处理日期格式
  26. df['日期'] = pd.date_range('2023-01-01', periods=3)
  27. df.to_csv('output.csv', date_format='%Y-%m-%d')  # 指定日期格式
  28. # 压缩输出
  29. df.to_csv('output.csv.gz', compression='gzip')  # 输出为gzip压缩文件
复制代码

Excel文件操作

Excel文件是商业和科研领域常用的数据存储格式,特别是当数据包含多个工作表或需要格式化时。pandas通过read_excel()和to_excel()函数支持Excel文件操作。

读取Excel文件

使用pd.read_excel()函数读取Excel文件:
  1. import pandas as pd
  2. # 基本读取
  3. df = pd.read_excel('data.xlsx')
  4. # 指定工作表
  5. df = pd.read_excel('data.xlsx', sheet_name='Sheet1')  # 按名称指定
  6. df = pd.read_excel('data.xlsx', sheet_name=0)  # 按索引指定(第一个工作表)
  7. # 读取多个工作表
  8. all_sheets = pd.read_excel('data.xlsx', sheet_name=None)  # 返回所有工作表的字典
  9. for sheet_name, df in all_sheets.items():
  10.     print(f"工作表名: {sheet_name}")
  11.     print(df.head())
  12. # 指定列名和索引
  13. df = pd.read_excel('data.xlsx', header=0)  # 使用第一行作为列名(默认)
  14. df = pd.read_excel('data.xlsx', header=None)  # 没有列名
  15. df = pd.read_excel('data.xlsx', index_col='id')  # 使用'id'列作为索引
  16. # 只读取部分列
  17. df = pd.read_excel('data.xlsx', usecols=['列1', '列3'])  # 只读取指定列
  18. df = pd.read_excel('data.xlsx', usecols=[0, 2])  # 只读取第1和第3列
  19. # 跳过行
  20. df = pd.read_excel('data.xlsx', skiprows=2)  # 跳过前2行
  21. df = pd.read_excel('data.xlsx', skiprows=[1, 3])  # 跳过第2和第4行
  22. # 指定数据类型
  23. df = pd.read_excel('data.xlsx', dtype={'列1': 'int64', '列2': 'float64'})
复制代码

写入Excel文件

使用DataFrame的to_excel()方法将数据写入Excel文件:
  1. import pandas as pd
  2. # 创建示例DataFrame
  3. data = {
  4.     '姓名': ['张三', '李四', '王五'],
  5.     '年龄': [25, 30, 35],
  6.     '城市': ['北京', '上海', '广州']
  7. }
  8. df = pd.DataFrame(data)
  9. # 基本写入
  10. df.to_excel('output.xlsx')
  11. # 不写入索引
  12. df.to_excel('output.xlsx', index=False)
  13. # 指定工作表名称
  14. df.to_excel('output.xlsx', sheet_name='数据表')
  15. # 写入到Excel文件的特定位置(单元格)
  16. df.to_excel('output.xlsx', startrow=1, startcol=1)  # 从B2单元格开始写入
  17. # 写入多个工作表
  18. with pd.ExcelWriter('multi_sheet.xlsx') as writer:
  19.     df1.to_excel(writer, sheet_name='数据1')
  20.     df2.to_excel(writer, sheet_name='数据2')
  21. # 追加到现有Excel文件
  22. with pd.ExcelWriter('existing.xlsx', mode='a', engine='openpyxl') as writer:
  23.     df.to_excel(writer, sheet_name='新数据')
  24. # 处理日期格式
  25. df['日期'] = pd.date_range('2023-01-01', periods=3)
  26. df.to_excel('output.xlsx', date_format='YYYY-MM-DD')
  27. # 设置列宽
  28. with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
  29.     df.to_excel(writer, sheet_name='数据表', index=False)
  30.     # 获取工作表对象
  31.     worksheet = writer.sheets['数据表']
  32.     # 设置列宽
  33.     worksheet.set_column('A:A', 20)  # A列宽度为20
  34.     worksheet.set_column('B:C', 15)  # B到C列宽度为15
  35. # 添加条件格式
  36. with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
  37.     df.to_excel(writer, sheet_name='数据表', index=False)
  38.     workbook = writer.book
  39.     worksheet = writer.sheets['数据表']
  40.    
  41.     # 添加条件格式 - 将年龄大于30的单元格标红
  42.     format1 = workbook.add_format({'bg_color': '#FFC7CE'})
  43.     worksheet.conditional_format('B2:B4', {'type': 'cell',
  44.                                           'criteria': '>',
  45.                                           'value': 30,
  46.                                           'format': format1})
复制代码

其他格式文件操作

除了CSV和Excel,pandas还支持多种其他数据格式的读写操作,下面介绍几种常用格式。

JSON文件操作

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用。
  1. import pandas as pd
  2. import json
  3. # 读取JSON文件
  4. df = pd.read_json('data.json')
  5. # 从JSON字符串读取
  6. json_str = '{"姓名": ["张三", "李四"], "年龄": [25, 30]}'
  7. df = pd.read_json(json_str)
  8. # 写入JSON文件
  9. df.to_json('output.json')
  10. # 指定JSON格式
  11. df.to_json('output.json', orient='records')  # 每行作为一个JSON对象
  12. df.to_json('output.json', orient='split')  # 分割格式
  13. df.to_json('output.json', orient='index')  # 索引格式
  14. df.to_json('output.json', orient='values')  # 只包含值,不包含索引和列名
  15. # 处理嵌套JSON
  16. # 假设有一个嵌套的JSON文件
  17. nested_json = """
  18. {
  19.     "employees": [
  20.         {"name": "张三", "age": 25, "contact": {"email": "zhangsan@example.com", "phone": "123456"}},
  21.         {"name": "李四", "age": 30, "contact": {"email": "lisi@example.com", "phone": "789012"}}
  22.     ]
  23. }
  24. """
  25. # 使用json_normalize处理嵌套JSON
  26. data = json.loads(nested_json)
  27. df = pd.json_normalize(data['employees'])
  28. print(df)
复制代码

HTML文件操作

pandas可以直接从HTML表格中读取数据,也可以将DataFrame转换为HTML表格。
  1. import pandas as pd
  2. # 从HTML读取表格
  3. # 注意:需要安装lxml或html5lib库
  4. # pip install lxml html5lib
  5. # 读取HTML文件中的所有表格
  6. tables = pd.read_html('data.html')
  7. df = tables[0]  # 获取第一个表格
  8. # 从URL读取HTML表格
  9. url = 'https://en.wikipedia.org/wiki/List_of_countries_by_population'
  10. tables = pd.read_html(url)
  11. df = tables[0]  # 通常第一个表格是主要内容
  12. # 将DataFrame写入HTML
  13. df.to_html('output.html')
  14. # 自定义HTML输出
  15. df.to_html('output.html',
  16.            table_id='data_table',  # 设置表格ID
  17.            classes='table table-striped',  # 添加CSS类
  18.            escape=False,  # 不转义HTML字符
  19.            render_links=True,  # 渲染链接
  20.            index=False)  # 不包含索引
复制代码

SQL数据库操作

pandas可以与SQL数据库进行交互,支持多种数据库引擎。
  1. import pandas as pd
  2. import sqlite3  # SQLite数据库
  3. from sqlalchemy import create_engine  # 支持多种数据库
  4. # 连接到SQLite数据库
  5. conn = sqlite3.connect('database.db')
  6. # 从SQL查询读取数据
  7. df = pd.read_sql('SELECT * FROM employees', conn)
  8. # 使用参数化查询
  9. query = 'SELECT * FROM employees WHERE department = ?'
  10. df = pd.read_sql(query, conn, params=['IT'])
  11. # 读取整个表
  12. df = pd.read_sql_table('employees', conn)
  13. # 将DataFrame写入SQL数据库
  14. df.to_sql('new_table', conn, if_exists='replace')  # 如果表存在则替换
  15. df.to_sql('new_table', conn, if_exists='append')  # 如果表存在则追加
  16. # 使用SQLAlchemy连接其他数据库
  17. # MySQL
  18. engine = create_engine('mysql+pymysql://user:password@localhost:3306/database')
  19. # PostgreSQL
  20. engine = create_engine('postgresql://user:password@localhost:5432/database')
  21. # 使用SQLAlchemy引擎读写数据
  22. df = pd.read_sql('SELECT * FROM employees', engine)
  23. df.to_sql('new_table', engine, if_exists='replace')
复制代码

Parquet文件操作

Parquet是一种高效的列式存储格式,适合大数据处理。
  1. import pandas as pd
  2. # 读取Parquet文件
  3. df = pd.read_parquet('data.parquet')
  4. # 写入Parquet文件
  5. df.to_parquet('output.parquet')
  6. # 指定压缩算法
  7. df.to_parquet('output.snappy.parquet', compression='snappy')
  8. df.to_parquet('output.gzip.parquet', compression='gzip')
  9. # 分区写入(大数据处理常用)
  10. # 假设有一个包含日期列的大DataFrame
  11. df['date'] = pd.date_range('2023-01-01', periods=1000)
  12. # 按日期分区
  13. df.to_parquet('partitioned_data', partition_cols=['date'])
复制代码

HDF5文件操作

HDF5是一种适合存储大型科学数据集的格式。
  1. import pandas as pd
  2. import numpy as np
  3. # 创建一个较大的DataFrame用于演示
  4. large_df = pd.DataFrame({
  5.     'A': np.random.randn(1000),
  6.     'B': np.random.randn(1000),
  7.     'C': np.random.randn(1000)
  8. })
  9. # 写入HDF5文件
  10. large_df.to_hdf('large_data.h5', key='df', mode='w')
  11. # 读取HDF5文件
  12. df = pd.read_hdf('large_data.h5', key='df')
  13. # 存储多个DataFrame到同一个HDF5文件
  14. df1 = pd.DataFrame({'A': [1, 2, 3]})
  15. df2 = pd.DataFrame({'B': [4, 5, 6]})
  16. # 使用'store'对象
  17. store = pd.HDFStore('multiple_data.h5')
  18. store['df1'] = df1
  19. store['df2'] = df2
  20. store.close()
  21. # 读取HDF5文件中的多个DataFrame
  22. store = pd.HDFStore('multiple_data.h5')
  23. print(store['df1'])
  24. print(store['df2'])
  25. store.close()
复制代码

高级技巧

在处理文件操作时,掌握一些高级技巧可以大大提高效率和代码质量。

处理大文件

当处理大文件时,内存可能成为瓶颈。pandas提供了几种方法来处理这种情况:
  1. import pandas as pd
  2. # 1. 分块读取CSV文件
  3. chunk_size = 10000  # 每次读取10000行
  4. chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)
  5. for chunk in chunks:
  6.     # 处理每个数据块
  7.     process_chunk(chunk)
  8.    
  9. # 2. 指定列读取
  10. # 只读取需要的列,减少内存使用
  11. df = pd.read_csv('large_file.csv', usecols=['col1', 'col2', 'col5'])
  12. # 3. 指定数据类型
  13. # 为每列指定适当的数据类型,减少内存使用
  14. dtypes = {
  15.     'id': 'int32',
  16.     'name': 'category',  # 对于低基数字符串列,使用category类型
  17.     'price': 'float32',
  18.     'date': 'str'
  19. }
  20. df = pd.read_csv('large_file.csv', dtype=dtypes)
  21. # 4. 使用低内存模式
  22. df = pd.read_csv('large_file.csv', low_memory=True)
  23. # 5. 迭代器模式
  24. # 创建一个迭代器,按需读取数据
  25. reader = pd.read_csv('large_file.csv', iterator=True)
  26. df = reader.get_chunk(1000)  # 读取前1000行
  27. df = reader.get_chunk(500)   # 再读取500行
复制代码

性能优化

优化文件操作的性能可以显著提高数据处理速度:
  1. import pandas as pd
  2. # 1. 使用更快的引擎
  3. # CSV读取
  4. df = pd.read_csv('data.csv', engine='c')  # C引擎(默认)
  5. df = pd.read_csv('data.csv', engine='python')  # Python引擎,某些情况下更快
  6. # Excel读取
  7. df = pd.read_excel('data.xlsx', engine='openpyxl')  # 适用于.xlsx文件
  8. df = pd.read_excel('data.xls', engine='xlrd')  # 适用于.xls文件
  9. # 2. 禁用不必要的功能
  10. # 读取CSV时禁用索引和列名推断
  11. df = pd.read_csv('data.csv', index_col=False, header=None)
  12. # 3. 使用更快的文件格式
  13. # 对于频繁读写的数据,考虑使用更高效的格式如Parquet或HDF5
  14. df.to_parquet('data.parquet')  # 写入
  15. df = pd.read_parquet('data.parquet')  # 读取
  16. # 4. 并行处理
  17. # 对于多个文件,可以使用多进程并行处理
  18. from multiprocessing import Pool
  19. import os
  20. def process_file(filename):
  21.     df = pd.read_csv(filename)
  22.     # 处理数据
  23.     return processed_df
  24. file_list = [f for f in os.listdir('.') if f.endswith('.csv')]
  25. with Pool(processes=4) as pool:  # 使用4个进程
  26.     results = pool.map(process_file, file_list)
复制代码

错误处理和异常管理

健壮的代码需要良好的错误处理机制:
  1. import pandas as pd
  2. import os
  3. # 1. 文件存在性检查
  4. filename = 'data.csv'
  5. if os.path.exists(filename):
  6.     df = pd.read_csv(filename)
  7. else:
  8.     print(f"错误:文件 {filename} 不存在")
  9.     # 可以创建一个空DataFrame或采取其他措施
  10.     df = pd.DataFrame()
  11. # 2. 使用try-except处理异常
  12. try:
  13.     df = pd.read_csv('data.csv', encoding='utf-8')
  14. except UnicodeDecodeError:
  15.     try:
  16.         # 尝试其他编码
  17.         df = pd.read_csv('data.csv', encoding='gbk')
  18.     except Exception as e:
  19.         print(f"读取文件时出错: {e}")
  20.         df = pd.DataFrame()
  21. except FileNotFoundError:
  22.     print("文件不存在")
  23.     df = pd.DataFrame()
  24. except Exception as e:
  25.     print(f"未知错误: {e}")
  26.     df = pd.DataFrame()
  27. # 3. 写入文件时的错误处理
  28. try:
  29.     df.to_csv('output.csv')
  30. except PermissionError:
  31.     print("错误:没有写入权限")
  32. except Exception as e:
  33.     print(f"写入文件时出错: {e}")
  34. # 4. 使用上下文管理器处理文件资源
  35. # 对于某些操作,使用with语句确保资源正确释放
  36. with pd.ExcelWriter('output.xlsx') as writer:
  37.     df1.to_excel(writer, sheet_name='Sheet1')
  38.     df2.to_excel(writer, sheet_name='Sheet2')
  39. # 文件会自动保存并关闭
复制代码

数据验证和清洗

在读取数据后,通常需要进行验证和清洗:
  1. import pandas as pd
  2. import numpy as np
  3. # 读取数据
  4. df = pd.read_csv('data.csv')
  5. # 1. 检查缺失值
  6. print(df.isnull().sum())  # 每列的缺失值数量
  7. # 处理缺失值
  8. df = df.dropna()  # 删除包含缺失值的行
  9. df = df.fillna(0)  # 用0填充缺失值
  10. df['列名'] = df['列名'].fillna(df['列名'].mean())  # 用均值填充
  11. # 2. 检查数据类型
  12. print(df.dtypes)
  13. # 转换数据类型
  14. df['age'] = df['age'].astype(int)
  15. df['price'] = pd.to_numeric(df['price'], errors='coerce')  # 转换为数字,无法转换的设为NaN
  16. # 3. 检查重复值
  17. print(df.duplicated().sum())  # 重复行的数量
  18. # 删除重复值
  19. df = df.drop_duplicates()
  20. # 4. 检查异常值
  21. # 使用描述性统计
  22. print(df.describe())
  23. # 使用IQR方法检测异常值
  24. Q1 = df['列名'].quantile(0.25)
  25. Q3 = df['列名'].quantile(0.75)
  26. IQR = Q3 - Q1
  27. lower_bound = Q1 - 1.5 * IQR
  28. upper_bound = Q3 + 1.5 * IQR
  29. outliers = df[(df['列名'] < lower_bound) | (df['列名'] > upper_bound)]
  30. print(f"检测到 {len(outliers)} 个异常值")
  31. # 5. 字符串清洗
  32. df['text_column'] = df['text_column'].str.strip()  # 去除前后空格
  33. df['text_column'] = df['text_column'].str.lower()  # 转换为小写
  34. df['text_column'] = df['text_column'].str.replace('[^\w\s]', '')  # 去除标点符号
复制代码

实战案例

让我们通过一个综合案例,展示如何将多种文件格式操作结合起来解决实际问题。

案例背景

假设我们是一家零售公司,需要分析销售数据。数据来自多个来源:CSV文件包含每日销售记录,Excel文件包含产品信息和员工信息,JSON文件包含客户反馈。我们需要将这些数据整合起来,进行分析,并生成一份综合报告。

数据准备

首先,让我们创建一些模拟数据:
  1. import pandas as pd
  2. import numpy as np
  3. import json
  4. from datetime import datetime, timedelta
  5. # 1. 创建销售数据 (CSV格式)
  6. np.random.seed(42)
  7. date_range = pd.date_range(start='2023-01-01', end='2023-12-31')
  8. products = ['产品A', '产品B', '产品C', '产品D', '产品E']
  9. stores = ['北京店', '上海店', '广州店', '深圳店']
  10. sales_data = []
  11. for _ in range(10000):  # 生成10000条销售记录
  12.     sales_data.append({
  13.         '日期': np.random.choice(date_range),
  14.         '产品ID': np.random.randint(1, 6),
  15.         '商店ID': np.random.randint(1, 5),
  16.         '销量': np.random.randint(1, 50),
  17.         '单价': np.random.uniform(10, 100),
  18.         '销售员ID': np.random.randint(1, 21)
  19.     })
  20. sales_df = pd.DataFrame(sales_data)
  21. sales_df['总价'] = sales_df['销量'] * sales_df['单价']
  22. sales_df.to_csv('sales_data.csv', index=False, encoding='utf-8')
  23. # 2. 创建产品信息 (Excel格式)
  24. products_data = {
  25.     '产品ID': range(1, 6),
  26.     '产品名称': products,
  27.     '类别': ['电子产品', '服装', '食品', '家具', '化妆品'],
  28.     '成本': [15, 30, 5, 50, 25]
  29. }
  30. products_df = pd.DataFrame(products_data)
  31. # 3. 创建商店信息 (Excel格式)
  32. stores_data = {
  33.     '商店ID': range(1, 5),
  34.     '商店名称': stores,
  35.     '城市': ['北京', '上海', '广州', '深圳'],
  36.     '区域': ['华北', '华东', '华南', '华南'],
  37.     '开业日期': ['2020-01-15', '2019-05-20', '2021-03-10', '2022-07-05']
  38. }
  39. stores_df = pd.DataFrame(stores_data)
  40. # 将产品信息和商店信息写入同一个Excel文件的不同工作表
  41. with pd.ExcelWriter('store_info.xlsx') as writer:
  42.     products_df.to_excel(writer, sheet_name='产品信息', index=False)
  43.     stores_df.to_excel(writer, sheet_name='商店信息', index=False)
  44. # 4. 创建员工信息 (JSON格式)
  45. employees_data = []
  46. for i in range(1, 21):
  47.     employees_data.append({
  48.         '员工ID': i,
  49.         '姓名': f'员工{i}',
  50.         '职位': np.random.choice(['销售员', '销售主管', '店长'], p=[0.7, 0.2, 0.1]),
  51.         '入职日期': (datetime.now() - timedelta(days=np.random.randint(30, 2000))).strftime('%Y-%m-%d'),
  52.         '商店ID': np.random.randint(1, 5),
  53.         '联系方式': {
  54.             '电话': f'1{np.random.randint(3000000000, 9999999999)}',
  55.             '邮箱': f'employee{i}@example.com'
  56.         }
  57.     })
  58. with open('employees.json', 'w', encoding='utf-8') as f:
  59.     json.dump(employees_data, f, ensure_ascii=False, indent=2)
  60. # 5. 创建客户反馈 (JSON格式)
  61. feedback_data = []
  62. for i in range(500):
  63.     feedback_data.append({
  64.         '反馈ID': i + 1,
  65.         '产品ID': np.random.randint(1, 6),
  66.         '客户ID': np.random.randint(1000, 2000),
  67.         '评分': np.random.randint(1, 6),
  68.         '反馈内容': f'这是关于产品{np.random.randint(1, 6)}的反馈',
  69.         '反馈日期': (datetime.now() - timedelta(days=np.random.randint(1, 365))).strftime('%Y-%m-%d')
  70.     })
  71. with open('customer_feedback.json', 'w', encoding='utf-8') as f:
  72.     json.dump(feedback_data, f, ensure_ascii=False, indent=2)
复制代码

数据整合与分析

现在,我们将读取这些数据并进行整合分析:
  1. import pandas as pd
  2. import json
  3. import numpy as np
  4. from datetime import datetime
  5. import matplotlib.pyplot as plt
  6. # 1. 读取销售数据 (CSV)
  7. print("正在读取销售数据...")
  8. sales_df = pd.read_csv('sales_data.csv', encoding='utf-8')
  9. print(f"销售数据形状: {sales_df.shape}")
  10. print(sales_df.head())
  11. # 2. 读取产品信息和商店信息 (Excel)
  12. print("\n正在读取产品信息和商店信息...")
  13. products_df = pd.read_excel('store_info.xlsx', sheet_name='产品信息')
  14. stores_df = pd.read_excel('store_info.xlsx', sheet_name='商店信息')
  15. print(f"产品数据形状: {products_df.shape}")
  16. print(f"商店数据形状: {stores_df.shape}")
  17. # 3. 读取员工信息 (JSON)
  18. print("\n正在读取员工信息...")
  19. with open('employees.json', 'r', encoding='utf-8') as f:
  20.     employees_data = json.load(f)
  21. # 将嵌套的JSON数据扁平化
  22. employees_df = pd.json_normalize(employees_data)
  23. print(f"员工数据形状: {employees_df.shape}")
  24. # 4. 读取客户反馈 (JSON)
  25. print("\n正在读取客户反馈...")
  26. with open('customer_feedback.json', 'r', encoding='utf-8') as f:
  27.     feedback_data = json.load(f)
  28. feedback_df = pd.DataFrame(feedback_data)
  29. print(f"反馈数据形状: {feedback_df.shape}")
  30. # 5. 数据整合
  31. print("\n正在整合数据...")
  32. # 合并销售数据和产品信息
  33. sales_products = pd.merge(sales_df, products_df, on='产品ID', how='left')
  34. # 合并商店信息
  35. sales_products_stores = pd.merge(sales_products, stores_df, on='商店ID', how='left')
  36. # 合并员工信息
  37. full_data = pd.merge(sales_products_stores, employees_df, left_on='销售员ID', right_on='员工ID', how='left')
  38. print(f"整合后数据形状: {full_data.shape}")
  39. # 6. 数据清洗
  40. print("\n正在清洗数据...")
  41. # 检查缺失值
  42. print("缺失值统计:")
  43. print(full_data.isnull().sum())
  44. # 处理日期格式
  45. full_data['日期'] = pd.to_datetime(full_data['日期'])
  46. full_data['入职日期'] = pd.to_datetime(full_data['入职日期'])
  47. full_data['开业日期'] = pd.to_datetime(full_data['开业日期'])
  48. # 计算利润
  49. full_data['利润'] = full_data['总价'] - (full_data['销量'] * full_data['成本'])
  50. # 7. 数据分析
  51. print("\n正在进行数据分析...")
  52. # 7.1 销售总额分析
  53. total_sales = full_data['总价'].sum()
  54. total_profit = full_data['利润'].sum()
  55. print(f"销售总额: {total_sales:,.2f}元")
  56. print(f"总利润: {total_profit:,.2f}元")
  57. # 7.2 按产品类别分析
  58. category_sales = full_data.groupby('类别')['总价'].sum().sort_values(ascending=False)
  59. print("\n按产品类别的销售额:")
  60. print(category_sales)
  61. # 7.3 按商店分析
  62. store_sales = full_data.groupby('商店名称')['总价'].sum().sort_values(ascending=False)
  63. print("\n按商店的销售额:")
  64. print(store_sales)
  65. # 7.4 按月份分析
  66. full_data['月份'] = full_data['日期'].dt.to_period('M')
  67. monthly_sales = full_data.groupby('月份')['总价'].sum()
  68. print("\n月度销售额趋势:")
  69. print(monthly_sales.head(12))
  70. # 7.5 员工业绩分析
  71. employee_performance = full_data.groupby(['员工ID', '姓名'])['总价'].sum().sort_values(ascending=False)
  72. print("\n员工销售业绩排行:")
  73. print(employee_performance.head(10))
  74. # 8. 客户反馈分析
  75. print("\n正在分析客户反馈...")
  76. # 合并反馈数据和产品信息
  77. feedback_with_products = pd.merge(feedback_df, products_df, on='产品ID', how='left')
  78. # 计算每个产品的平均评分
  79. product_ratings = feedback_with_products.groupby('产品名称')['评分'].mean().sort_values(ascending=False)
  80. print("\n产品评分排行:")
  81. print(product_ratings)
  82. # 9. 可视化
  83. print("\n正在生成可视化图表...")
  84. # 9.1 产品类别销售额饼图
  85. plt.figure(figsize=(10, 6))
  86. category_sales.plot.pie(autopct='%1.1f%%')
  87. plt.title('按产品类别的销售额分布')
  88. plt.ylabel('')
  89. plt.savefig('category_sales_pie.png')
  90. plt.close()
  91. # 9.2 月度销售额趋势图
  92. plt.figure(figsize=(12, 6))
  93. monthly_sales.plot()
  94. plt.title('月度销售额趋势')
  95. plt.xlabel('月份')
  96. plt.ylabel('销售额')
  97. plt.grid(True)
  98. plt.savefig('monthly_sales_trend.png')
  99. plt.close()
  100. # 9.3 员工业绩条形图
  101. plt.figure(figsize=(12, 6))
  102. employee_performance.head(10).plot.barh()
  103. plt.title('员工销售业绩排行 (前10名)')
  104. plt.xlabel('销售额')
  105. plt.ylabel('员工')
  106. plt.tight_layout()
  107. plt.savefig('employee_performance.png')
  108. plt.close()
  109. # 9.4 产品评分条形图
  110. plt.figure(figsize=(10, 6))
  111. product_ratings.plot.bar()
  112. plt.title('产品评分排行')
  113. plt.xlabel('产品')
  114. plt.ylabel('平均评分')
  115. plt.ylim(0, 5)  # 评分范围1-5
  116. plt.tight_layout()
  117. plt.savefig('product_ratings.png')
  118. plt.close()
  119. # 10. 生成综合报告
  120. print("\n正在生成综合报告...")
  121. # 创建一个汇总DataFrame
  122. summary_data = {
  123.     '指标': ['销售总额', '总利润', '总订单数', '平均订单金额', '最高评分产品', '最低评分产品', '最佳销售员工'],
  124.     '值': [
  125.         f"{total_sales:,.2f}元",
  126.         f"{total_profit:,.2f}元",
  127.         f"{len(full_data):,}",
  128.         f"{full_data['总价'].mean():.2f}元",
  129.         f"{product_ratings.idxmax()} ({product_ratings.max():.2f}分)",
  130.         f"{product_ratings.idxmin()} ({product_ratings.min():.2f}分)",
  131.         f"{employee_performance.idxmax()[1]} ({employee_performance.max():,.2f}元)"
  132.     ]
  133. }
  134. summary_df = pd.DataFrame(summary_data)
  135. # 将汇总数据保存到Excel
  136. with pd.ExcelWriter('sales_analysis_report.xlsx') as writer:
  137.     summary_df.to_excel(writer, sheet_name='汇总', index=False)
  138.     category_sales.to_excel(writer, sheet_name='按类别销售额')
  139.     store_sales.to_excel(writer, sheet_name='按商店销售额')
  140.     monthly_sales.to_excel(writer, sheet_name='月度销售额')
  141.     employee_performance.to_excel(writer, sheet_name='员工销售业绩')
  142.     product_ratings.to_excel(writer, sheet_name='产品评分')
  143. print("\n分析完成!报告已保存到 'sales_analysis_report.xlsx'")
  144. print("可视化图表已保存:")
  145. print("- category_sales_pie.png")
  146. print("- monthly_sales_trend.png")
  147. print("- employee_performance.png")
  148. print("- product_ratings.png")
复制代码

结果输出

执行上述代码后,我们将得到以下输出:

1. 一个名为sales_analysis_report.xlsx的综合报告Excel文件,包含多个工作表:汇总:整体业绩指标按类别销售额:各产品类别的销售情况按商店销售额:各商店的销售情况月度销售额:月度销售趋势员工销售业绩:员工销售业绩排行产品评分:各产品的客户评分情况
2. 汇总:整体业绩指标
3. 按类别销售额:各产品类别的销售情况
4. 按商店销售额:各商店的销售情况
5. 月度销售额:月度销售趋势
6. 员工销售业绩:员工销售业绩排行
7. 产品评分:各产品的客户评分情况
8. 四个可视化图表PNG文件:category_sales_pie.png:产品类别销售额分布饼图monthly_sales_trend.png:月度销售额趋势图employee_performance.png:员工销售业绩排行条形图product_ratings.png:产品评分条形图
9. category_sales_pie.png:产品类别销售额分布饼图
10. monthly_sales_trend.png:月度销售额趋势图
11. employee_performance.png:员工销售业绩排行条形图
12. product_ratings.png:产品评分条形图

一个名为sales_analysis_report.xlsx的综合报告Excel文件,包含多个工作表:

• 汇总:整体业绩指标
• 按类别销售额:各产品类别的销售情况
• 按商店销售额:各商店的销售情况
• 月度销售额:月度销售趋势
• 员工销售业绩:员工销售业绩排行
• 产品评分:各产品的客户评分情况

四个可视化图表PNG文件:

• category_sales_pie.png:产品类别销售额分布饼图
• monthly_sales_trend.png:月度销售额趋势图
• employee_performance.png:员工销售业绩排行条形图
• product_ratings.png:产品评分条形图

这个案例展示了如何使用pandas读取和处理多种格式的数据文件(CSV、Excel、JSON),进行数据整合、清洗、分析,并生成综合报告和可视化图表。通过这种方式,我们可以从多个数据源中提取有价值的信息,为业务决策提供支持。

总结

本文全面介绍了使用pandas进行多种格式文件读取与写入操作的方法,从基础的CSV和Excel文件,到JSON、HTML、SQL、Parquet和HDF5等高级格式。通过详细的代码示例和实战案例,我们展示了如何将这些技术应用到实际数据处理工作中。

关键要点回顾

1. CSV文件操作:使用pd.read_csv()和df.to_csv()进行CSV文件的读写掌握常用参数如sep、encoding、header、index_col等处理大文件时可使用chunksize参数进行分块读取
2. 使用pd.read_csv()和df.to_csv()进行CSV文件的读写
3. 掌握常用参数如sep、encoding、header、index_col等
4. 处理大文件时可使用chunksize参数进行分块读取
5. Excel文件操作:使用pd.read_excel()和df.to_excel()进行Excel文件的读写处理多个工作表、指定单元格位置等高级操作结合ExcelWriter对象进行复杂Excel文件操作
6. 使用pd.read_excel()和df.to_excel()进行Excel文件的读写
7. 处理多个工作表、指定单元格位置等高级操作
8. 结合ExcelWriter对象进行复杂Excel文件操作
9. 其他格式文件操作:JSON:使用pd.read_json()和df.to_json(),处理嵌套JSON时可用pd.json_normalize()HTML:使用pd.read_html()从网页中提取表格数据SQL:使用pd.read_sql()和df.to_sql()与数据库交互Parquet:高效的列式存储格式,适合大数据处理HDF5:适合存储大型科学数据集
10. JSON:使用pd.read_json()和df.to_json(),处理嵌套JSON时可用pd.json_normalize()
11. HTML:使用pd.read_html()从网页中提取表格数据
12. SQL:使用pd.read_sql()和df.to_sql()与数据库交互
13. Parquet:高效的列式存储格式,适合大数据处理
14. HDF5:适合存储大型科学数据集
15. 高级技巧:处理大文件:分块读取、指定列、优化数据类型性能优化:选择合适的引擎、禁用不必要功能、使用高效格式错误处理:文件存在性检查、异常捕获、资源管理数据验证和清洗:处理缺失值、检查数据类型、处理异常值
16. 处理大文件:分块读取、指定列、优化数据类型
17. 性能优化:选择合适的引擎、禁用不必要功能、使用高效格式
18. 错误处理:文件存在性检查、异常捕获、资源管理
19. 数据验证和清洗:处理缺失值、检查数据类型、处理异常值
20. 实战应用:多源数据整合:从不同格式的文件中读取数据并合并数据分析与可视化:生成洞察和图表报告生成:创建综合性的分析报告
21. 多源数据整合:从不同格式的文件中读取数据并合并
22. 数据分析与可视化:生成洞察和图表
23. 报告生成:创建综合性的分析报告

CSV文件操作:

• 使用pd.read_csv()和df.to_csv()进行CSV文件的读写
• 掌握常用参数如sep、encoding、header、index_col等
• 处理大文件时可使用chunksize参数进行分块读取

Excel文件操作:

• 使用pd.read_excel()和df.to_excel()进行Excel文件的读写
• 处理多个工作表、指定单元格位置等高级操作
• 结合ExcelWriter对象进行复杂Excel文件操作

其他格式文件操作:

• JSON:使用pd.read_json()和df.to_json(),处理嵌套JSON时可用pd.json_normalize()
• HTML:使用pd.read_html()从网页中提取表格数据
• SQL:使用pd.read_sql()和df.to_sql()与数据库交互
• Parquet:高效的列式存储格式,适合大数据处理
• HDF5:适合存储大型科学数据集

高级技巧:

• 处理大文件:分块读取、指定列、优化数据类型
• 性能优化:选择合适的引擎、禁用不必要功能、使用高效格式
• 错误处理:文件存在性检查、异常捕获、资源管理
• 数据验证和清洗:处理缺失值、检查数据类型、处理异常值

实战应用:

• 多源数据整合:从不同格式的文件中读取数据并合并
• 数据分析与可视化:生成洞察和图表
• 报告生成:创建综合性的分析报告

最佳实践建议

1. 选择合适的文件格式:对于小型数据集,CSV和Excel是简单易用的选择对于大型数据集,考虑使用Parquet或HDF5等高效格式对于Web应用,JSON是理想的数据交换格式
2. 对于小型数据集,CSV和Excel是简单易用的选择
3. 对于大型数据集,考虑使用Parquet或HDF5等高效格式
4. 对于Web应用,JSON是理想的数据交换格式
5. 优化性能:只读取需要的列和数据为每列指定适当的数据类型对于大型文件,使用分块处理
6. 只读取需要的列和数据
7. 为每列指定适当的数据类型
8. 对于大型文件,使用分块处理
9. 代码健壮性:始终检查文件是否存在使用try-except处理可能的异常确保文件资源正确释放
10. 始终检查文件是否存在
11. 使用try-except处理可能的异常
12. 确保文件资源正确释放
13. 数据质量:读取数据后进行验证和清洗处理缺失值和异常值确保数据类型正确
14. 读取数据后进行验证和清洗
15. 处理缺失值和异常值
16. 确保数据类型正确

选择合适的文件格式:

• 对于小型数据集,CSV和Excel是简单易用的选择
• 对于大型数据集,考虑使用Parquet或HDF5等高效格式
• 对于Web应用,JSON是理想的数据交换格式

优化性能:

• 只读取需要的列和数据
• 为每列指定适当的数据类型
• 对于大型文件,使用分块处理

代码健壮性:

• 始终检查文件是否存在
• 使用try-except处理可能的异常
• 确保文件资源正确释放

数据质量:

• 读取数据后进行验证和清洗
• 处理缺失值和异常值
• 确保数据类型正确

通过掌握pandas的文件操作技能,您可以更加高效地处理各种数据分析任务,从多个来源整合数据,提取有价值的信息,并为业务决策提供支持。希望本文能够帮助您全面掌握pandas的文件操作技能,提升数据处理能力。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

0

主题

826

科技点

516

积分

候风辨气

积分
516
发表于 2025-8-27 10:34:57 | 显示全部楼层 [标记阅至此楼]
感謝分享
温馨提示:看帖回帖是一种美德,您的每一次发帖、回帖都是对论坛最大的支持,谢谢! [这是默认签名,点我更换签名]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Discord频道

加入Discord频道

加入QQ社群

加入QQ社群

联系我们|小黑屋|TG频道|RSS |网站地图

Powered by Pixtech

© 2025-2026 Pixtech Team.