活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Python Pandas输出CSV文件实用指南数据分析必备详解各种导出技巧和常见问题解决方案提升工作效率让数据处理更得心应手

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-25 12:20:00 | 显示全部楼层 |阅读模式

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

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

x
1. Pandas与CSV文件简介

Pandas是Python数据分析领域最核心的库之一,提供了强大的数据结构和数据分析工具。而CSV(Comma-Separated Values)作为一种简单、通用的数据交换格式,在数据处理中扮演着至关重要的角色。CSV文件以纯文本形式存储表格数据,每行代表一条记录,字段之间用逗号分隔,几乎所有的数据处理工具都支持CSV格式,使其成为数据交换的理想选择。

在数据分析工作流中,我们经常需要将处理后的数据导出为CSV文件,以便与其他团队成员共享、在其他系统中使用或进行长期存储。Pandas提供了to_csv()方法,使得将DataFrame导出为CSV文件变得简单高效。掌握Pandas导出CSV的各种技巧,不仅能提高工作效率,还能避免许多常见的数据处理问题。

2. 基础导出方法

2.1 最简单的导出方式

Pandas中最基础的CSV导出方法是使用DataFrame.to_csv()函数。下面是一个最简单的例子:
  1. import pandas as pd
  2. # 创建一个简单的DataFrame
  3. data = {'Name': ['Alice', 'Bob', 'Charlie'],
  4.         'Age': [25, 30, 35],
  5.         'City': ['New York', 'Los Angeles', 'Chicago']}
  6. df = pd.DataFrame(data)
  7. # 导出到CSV文件
  8. df.to_csv('output.csv')
复制代码

执行上述代码后,会在当前目录下生成一个名为output.csv的文件。默认情况下,Pandas会将DataFrame的索引作为第一列写入CSV文件,列名作为第一行。

2.2 基本参数介绍

to_csv()方法有许多参数可以控制导出行为,下面是一些最常用的参数:
  1. df.to_csv(
  2.     path_or_buf='output.csv',  # 文件路径或文件对象
  3.     sep=',',                   # 分隔符,默认为逗号
  4.     na_rep='',                 # 缺失值的表示方式
  5.     float_format='%.2f',       # 浮点数格式
  6.     columns=None,              # 要写入的列
  7.     header=True,               # 是否写入列名
  8.     index=True,                # 是否写入行索引
  9.     index_label=None,          # 索引列的列名
  10.     encoding='utf-8',          # 文件编码
  11.     compression=None,          # 压缩选项
  12.     quotechar='"',             # 引用字符
  13.     quoting=csv.QUOTE_MINIMAL, # 引用规则
  14.     line_terminator='\n'       # 行终止符
  15. )
复制代码

3. 高级导出技巧

3.1 控制索引和列的导出

在实际应用中,我们经常需要控制是否导出索引或只导出特定的列:
  1. # 不导出索引
  2. df.to_csv('output_no_index.csv', index=False)
  3. # 只导出特定列
  4. df.to_csv('output_selected_columns.csv', columns=['Name', 'City'])
  5. # 不导出列名
  6. df.to_csv('output_no_header.csv', header=False)
  7. # 不导出索引和列名
  8. df.to_csv('output_no_index_no_header.csv', index=False, header=False)
复制代码

3.2 处理缺失值

当数据中存在缺失值(NaN)时,我们可以指定如何表示它们:
  1. # 创建包含缺失值的DataFrame
  2. import numpy as np
  3. data_with_na = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
  4.                 'Age': [25, 30, np.nan, 35],
  5.                 'City': ['New York', 'Los Angeles', None, 'Chicago']}
  6. df_na = pd.DataFrame(data_with_na)
  7. # 将缺失值导出为"NULL"
  8. df_na.to_csv('output_na_rep.csv', na_rep='NULL')
  9. # 将缺失值导出为空字符串
  10. df_na.to_csv('output_na_empty.csv', na_rep='')
复制代码

3.3 处理日期和时间

当DataFrame中包含日期时间数据时,我们需要特别注意:
  1. # 创建包含日期的DataFrame
  2. data_date = {'Name': ['Alice', 'Bob', 'Charlie'],
  3.              'Join_Date': pd.to_datetime(['2020-01-01', '2019-05-15', '2021-03-10']),
  4.              'Last_Login': pd.to_datetime(['2023-01-15 10:30:00', '2023-01-14 15:45:30', '2023-01-16 09:15:00'])}
  5. df_date = pd.DataFrame(data_date)
  6. # 导出日期,使用ISO格式
  7. df_date.to_csv('output_dates_iso.csv', date_format='%Y-%m-%d')
  8. # 导出日期时间,包含时间部分
  9. df_date.to_csv('output_datetime.csv', date_format='%Y-%m-%d %H:%M:%S')
复制代码

3.4 处理编码问题

在处理非ASCII字符时,编码问题尤为重要:
  1. # 创建包含非ASCII字符的DataFrame
  2. data_unicode = {'Name': ['张三', '李四', '王五'],
  3.                 'City': ['北京', '上海', '广州']}
  4. df_unicode = pd.DataFrame(data_unicode)
  5. # 使用UTF-8编码导出(推荐)
  6. df_unicode.to_csv('output_utf8.csv', encoding='utf-8')
  7. # 使用GBK编码(常用于中文Windows环境)
  8. df_unicode.to_csv('output_gbk.csv', encoding='gbk')
  9. # 使用UTF-8 with BOM编码(Excel兼容性更好)
  10. df_unicode.to_csv('output_utf8_bom.csv', encoding='utf-8-sig')
复制代码

3.5 处理大数据集

当处理大型数据集时,可以考虑以下技巧:
  1. # 创建一个大型DataFrame
  2. large_df = pd.DataFrame(np.random.rand(100000, 10))
  3. # 分块写入大型DataFrame
  4. chunk_size = 10000
  5. for i in range(0, len(large_df), chunk_size):
  6.     chunk = large_df.iloc[i:i+chunk_size]
  7.     # 第一次写入包含列名,后续追加不包含列名
  8.     chunk.to_csv('large_output.csv', mode='a', header=(i == 0), index=False)
  9. # 使用压缩减少文件大小
  10. large_df.to_csv('large_output.csv.gz', compression='gzip', index=False)
复制代码

3.6 自定义分隔符和格式

虽然CSV默认使用逗号作为分隔符,但我们可以根据需要更改:
  1. # 使用分号作为分隔符(在某些欧洲国家常用)
  2. df.to_csv('output_semicolon.csv', sep=';')
  3. # 使用制表符作为分隔符(TSV格式)
  4. df.to_csv('output_tab.tsv', sep='\t')
  5. # 使用管道符作为分隔符
  6. df.to_csv('output_pipe.csv', sep='|')
复制代码

3.7 处理引号和特殊字符

当数据中包含分隔符或特殊字符时,正确处理引号非常重要:
  1. # 创建包含特殊字符的DataFrame
  2. data_special = {'Text': ['This is a "quote"', 'Contains, a comma', 'Line\nBreak'],
  3.                 'Value': [1, 2, 3]}
  4. df_special = pd.DataFrame(data_special)
  5. # 使用不同的引用策略
  6. import csv
  7. # 最小引用(默认,只在必要时引用)
  8. df_special.to_csv('output_quote_minimal.csv', quoting=csv.QUOTE_MINIMAL)
  9. # 引用所有非数字字段
  10. df_special.to_csv('output_quote_nonnumeric.csv', quoting=csv.QUOTE_NONNUMERIC)
  11. # 引用所有字段
  12. df_special.to_csv('output_quote_all.csv', quoting=csv.QUOTE_ALL)
  13. # 不引用任何字段(谨慎使用)
  14. df_special.to_csv('output_quote_none.csv', quoting=csv.QUOTE_NONE)
复制代码

3.8 格式化数值输出

我们可以控制数值在CSV文件中的显示格式:
  1. # 创建包含各种数值类型的DataFrame
  2. data_numeric = {'Integer': [1, 2, 3],
  3.                 'Float': [1.23456789, 2.3456789, 3.456789],
  4.                 'Percentage': [0.1234, 0.2345, 0.3456],
  5.                 'Scientific': [1234567.89, 2345678.9, 3456789.0]}
  6. df_numeric = pd.DataFrame(data_numeric)
  7. # 格式化浮点数为两位小数
  8. df_numeric.to_csv('output_float_format.csv', float_format='%.2f')
  9. # 格式化为百分比
  10. df_numeric.to_csv('output_percentage.csv',
  11.                  float_format=lambda x: f'{x:.2%}')
  12. # 科学计数法
  13. df_numeric.to_csv('output_scientific.csv',
  14.                  float_format='%.2e')
复制代码

4. 常见问题及解决方案

4.1 Excel打开中文乱码

问题:使用UTF-8编码导出的CSV文件在Excel中打开时,中文字符显示为乱码。

解决方案:使用UTF-8 with BOM编码(utf-8-sig):
  1. df_unicode.to_csv('output_excel_chinese.csv', encoding='utf-8-sig', index=False)
复制代码

4.2 数字被科学计数法显示

问题:长数字在Excel中打开时被转换为科学计数法格式。

解决方案:在数字前添加制表符,强制Excel将其视为文本:
  1. # 创建一个包含长数字的DataFrame
  2. data_long_numbers = {'ID': ['12345678901234567890', '98765432109876543210'],
  3.                      'Value': [1000000000000, 2000000000000]}
  4. df_long_numbers = pd.DataFrame(data_long_numbers)
  5. # 在数字前添加制表符
  6. df_long_numbers['ID'] = df_long_numbers['ID'].apply(lambda x: f'\t{x}')
  7. df_long_numbers.to_csv('output_long_numbers.csv', index=False)
复制代码

4.3 日期格式问题

问题:导出的日期在Excel或其他系统中显示不正确。

解决方案:明确指定日期格式,或者将日期转换为字符串:
  1. # 方法1:指定日期格式
  2. df_date.to_csv('output_date_formatted.csv',
  3.               date_format='%Y-%m-%d',
  4.               index=False)
  5. # 方法2:将日期转换为所需格式的字符串
  6. df_date['Join_Date_Formatted'] = df_date['Join_Date'].dt.strftime('%Y-%m-%d')
  7. df_date.to_csv('output_date_string.csv', index=False)
复制代码

4.4 内存不足错误

问题:尝试导出大型DataFrame时出现内存不足错误。

解决方案:使用分块写入或使用更高效的数据类型:
  1. # 方法1:分块写入
  2. chunk_size = 50000  # 根据可用内存调整
  3. for i in range(0, len(large_df), chunk_size):
  4.     chunk = large_df.iloc[i:i+chunk_size]
  5.     chunk.to_csv('large_output_chunked.csv',
  6.                 mode='a',
  7.                 header=(i == 0),
  8.                 index=False)
  9. # 方法2:使用更高效的数据类型
  10. # 在创建DataFrame时指定数据类型
  11. dtypes = {'col1': 'int32', 'col2': 'float32', 'col3': 'category'}
  12. efficient_df = pd.DataFrame(data, dtype=dtypes)
  13. efficient_df.to_csv('efficient_output.csv', index=False)
复制代码

4.5 列顺序问题

问题:导出的CSV文件中列顺序与DataFrame中的列顺序不一致。

解决方案:明确指定列顺序:
  1. # 确保列按特定顺序导出
  2. desired_order = ['City', 'Name', 'Age']  # 不同于原始顺序
  3. df.to_csv('output_column_order.csv',
  4.          columns=desired_order,
  5.          index=False)
复制代码

4.6 处理包含逗号的文本

问题:数据字段中包含逗号,导致CSV文件结构混乱。

解决方案:确保正确使用引号:
  1. # 创建包含逗号的文本
  2. data_with_commas = {'Description': ['A, B, and C', 'X, Y, Z'],
  3.                     'Value': [1, 2]}
  4. df_commas = pd.DataFrame(data_with_commas)
  5. # 确保引用包含逗号的字段
  6. df_commas.to_csv('output_commas.csv',
  7.                 quoting=csv.QUOTE_NONNUMERIC,
  8.                 index=False)
复制代码

4.7 处理多行文本

问题:数据字段中包含换行符,导致CSV文件结构混乱。

解决方案:在导出前替换换行符或确保正确使用引号:
  1. # 创建包含换行符的文本
  2. data_with_newlines = {'Address': ['123 Main St\nApt 4', '456 Oak Ave\nSuite 200'],
  3.                      'Name': ['John Doe', 'Jane Smith']}
  4. df_newlines = pd.DataFrame(data_with_newlines)
  5. # 方法1:替换换行符
  6. df_newlines['Address'] = df_newlines['Address'].str.replace('\n', ' ')
  7. df_newlines.to_csv('output_newlines_replaced.csv', index=False)
  8. # 方法2:确保正确引用
  9. df_newlines.to_csv('output_newlines_quoted.csv',
  10.                   quoting=csv.QUOTE_ALL,
  11.                   index=False)
复制代码

5. 性能优化和最佳实践

5.1 减少内存使用

在处理大型数据集时,减少内存使用是关键:
  1. # 使用适当的数据类型减少内存使用
  2. def optimize_dtypes(df):
  3.     # 转换数值类型
  4.     for col in df.select_dtypes(include=['int64']).columns:
  5.         df[col] = pd.to_numeric(df[col], downcast='integer')
  6.    
  7.     # 转换浮点类型
  8.     for col in df.select_dtypes(include=['float64']).columns:
  9.         df[col] = pd.to_numeric(df[col], downcast='float')
  10.    
  11.     # 转换对象类型为分类类型(如果唯一值较少)
  12.     for col in df.select_dtypes(include=['object']).columns:
  13.         if len(df[col].unique()) / len(df[col]) < 0.5:  # 如果唯一值少于50%
  14.             df[col] = df[col].astype('category')
  15.    
  16.     return df
  17. # 优化DataFrame
  18. optimized_df = optimize_dtypes(large_df.copy())
  19. optimized_df.to_csv('optimized_output.csv', index=False)
复制代码

5.2 提高写入速度

以下是一些提高CSV写入速度的技巧:
  1. import time
  2. # 方法1:禁用索引写入
  3. start_time = time.time()
  4. df.to_csv('fast_output_no_index.csv', index=False)
  5. print(f"No index: {time.time() - start_time:.2f} seconds")
  6. # 方法2:使用更简单的格式
  7. start_time = time.time()
  8. df.to_csv('fast_output_simple.csv', index=False, header=False)
  9. print(f"Simple format: {time.time() - start_time:.2f} seconds")
  10. # 方法3:使用更快的编码(对于ASCII数据)
  11. start_time = time.time()
  12. df.to_csv('fast_output_ascii.csv', index=False, encoding='ascii')
  13. print(f"ASCII encoding: {time.time() - start_time:.2f} seconds")
复制代码

5.3 并行处理

对于非常大的数据集,可以考虑并行处理:
  1. from multiprocessing import Pool
  2. import os
  3. def process_chunk(chunk_args):
  4.     chunk, filename, mode, header = chunk_args
  5.     chunk.to_csv(filename, mode=mode, header=header, index=False)
  6.     return os.path.getsize(filename)
  7. def parallel_write(df, filename, num_processes=4):
  8.     # 将DataFrame分成多个块
  9.     chunks = np.array_split(df, num_processes)
  10.    
  11.     # 准备参数
  12.     chunk_args = []
  13.     for i, chunk in enumerate(chunks):
  14.         mode = 'w' if i == 0 else 'a'
  15.         header = (i == 0)
  16.         chunk_args.append((chunk, filename, mode, header))
  17.    
  18.     # 使用多进程并行写入
  19.     with Pool(processes=num_processes) as pool:
  20.         results = pool.map(process_chunk, chunk_args)
  21.    
  22.     return results
  23. # 使用并行处理写入大型DataFrame
  24. # parallel_write(large_df, 'parallel_output.csv')
复制代码

5.4 使用其他格式替代CSV

在某些情况下,考虑使用其他格式可能更高效:
  1. # 使用Parquet格式(列式存储,适合分析)
  2. df.to_parquet('output.parquet')
  3. # 使用Feather格式(读写速度非常快)
  4. df.to_feather('output.feather')
  5. # 使用HDF5格式(适合大型数据集)
  6. df.to_hdf('output.h5', key='df', mode='w')
  7. # 使用Pickle格式(Python对象序列化)
  8. df.to_pickle('output.pkl')
复制代码

6. 实际应用案例

6.1 数据分析报告导出

假设我们完成了一个销售数据分析,需要将结果导出为CSV供管理层查看:
  1. # 模拟销售数据分析结果
  2. sales_data = {
  3.     'Region': ['North', 'South', 'East', 'West'],
  4.     'Q1_Sales': [150000, 120000, 180000, 90000],
  5.     'Q2_Sales': [160000, 125000, 195000, 95000],
  6.     'Q3_Sales': [155000, 130000, 200000, 98000],
  7.     'Q4_Sales': [165000, 135000, 210000, 105000],
  8.     'Total_Sales': [630000, 510000, 785000, 398000],
  9.     'Growth_Rate': [0.10, 0.125, 0.167, 0.167]
  10. }
  11. sales_df = pd.DataFrame(sales_data)
  12. # 添加格式化的千位分隔符和百分比
  13. for col in ['Q1_Sales', 'Q2_Sales', 'Q3_Sales', 'Q4_Sales', 'Total_Sales']:
  14.     sales_df[col] = sales_df[col].apply(lambda x: f'${x:,.0f}')
  15. sales_df['Growth_Rate'] = sales_df['Growth_Rate'].apply(lambda x: f'{x:.1%}')
  16. # 导出为CSV,确保Excel能正确打开
  17. sales_df.to_csv('sales_report.csv',
  18.                encoding='utf-8-sig',
  19.                index=False)
复制代码

6.2 大型数据集采样导出

当我们有一个非常大的数据集,但只需要导出一个代表性样本时:
  1. # 创建一个大型DataFrame
  2. large_dataset = pd.DataFrame({
  3.     'id': range(1, 1000001),
  4.     'value': np.random.rand(1000000),
  5.     'category': np.random.choice(['A', 'B', 'C', 'D'], 1000000),
  6.     'date': pd.date_range('2020-01-01', periods=1000000, freq='H')
  7. })
  8. # 方法1:随机采样
  9. sample_size = 10000  # 采样大小
  10. random_sample = large_dataset.sample(n=sample_size, random_state=42)
  11. random_sample.to_csv('large_dataset_random_sample.csv', index=False)
  12. # 方法2:分层采样(确保每个类别都有代表性)
  13. stratified_sample = large_dataset.groupby('category').apply(
  14.     lambda x: x.sample(n=min(len(x), sample_size//4), random_state=42)
  15. ).reset_index(drop=True)
  16. stratified_sample.to_csv('large_dataset_stratified_sample.csv', index=False)
  17. # 方法3:时间序列采样(对于时间数据)
  18. time_sample = large_dataset.set_index('date').resample('D').first().reset_index()
  19. time_sample.to_csv('large_dataset_time_sample.csv', index=False)
复制代码

6.3 多表关联导出

在处理多个相关表时,我们可能需要将它们合并后导出:
  1. # 创建相关的DataFrame
  2. customers = pd.DataFrame({
  3.     'customer_id': [1, 2, 3, 4],
  4.     'name': ['Alice', 'Bob', 'Charlie', 'David'],
  5.     'email': ['alice@example.com', 'bob@example.com', 'charlie@example.com', 'david@example.com']
  6. })
  7. orders = pd.DataFrame({
  8.     'order_id': [101, 102, 103, 104, 105],
  9.     'customer_id': [1, 2, 1, 3, 2],
  10.     'order_date': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']),
  11.     'amount': [100.50, 75.25, 125.75, 50.00, 200.00]
  12. })
  13. products = pd.DataFrame({
  14.     'product_id': [1001, 1002, 1003, 1004],
  15.     'product_name': ['Widget', 'Gadget', 'Thingamajig', 'Doohickey'],
  16.     'price': [10.00, 15.00, 20.00, 5.00]
  17. })
  18. order_items = pd.DataFrame({
  19.     'order_item_id': [1001, 1002, 1003, 1004, 1005, 1006],
  20.     'order_id': [101, 101, 102, 103, 104, 105],
  21.     'product_id': [1001, 1002, 1003, 1001, 1004, 1002],
  22.     'quantity': [5, 3, 2, 8, 10, 5]
  23. })
  24. # 合并表创建综合视图
  25. merged_data = order_items.merge(orders, on='order_id') \
  26.                         .merge(customers, on='customer_id') \
  27.                         .merge(products, on='product_id')
  28. # 选择并重命名列以获得更清晰的输出
  29. final_data = merged_data[[
  30.     'order_id', 'order_date', 'customer_id', 'name', 'email',
  31.     'product_id', 'product_name', 'quantity', 'price', 'amount'
  32. ]].rename(columns={
  33.     'name': 'customer_name',
  34.     'price': 'unit_price'
  35. })
  36. # 添加计算列
  37. final_data['total_price'] = final_data['quantity'] * final_data['unit_price']
  38. # 格式化日期和数值
  39. final_data['order_date'] = final_data['order_date'].dt.strftime('%Y-%m-%d')
  40. final_data['unit_price'] = final_data['unit_price'].map('${:,.2f}'.format)
  41. final_data['total_price'] = final_data['total_price'].map('${:,.2f}'.format)
  42. final_data['amount'] = final_data['amount'].map('${:,.2f}'.format)
  43. # 导出综合数据
  44. final_data.to_csv('comprehensive_order_report.csv',
  45.                  encoding='utf-8-sig',
  46.                  index=False)
复制代码

6.4 数据清洗后导出

在数据清洗流程中,我们可能需要导出中间结果或最终清洗后的数据:
  1. # 创建包含各种数据质量问题的DataFrame
  2. messy_data = pd.DataFrame({
  3.     'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
  4.     'name': [' Alice ', 'Bob', '  Charlie  ', 'David', 'Eve', 'Frank', 'Grace', 'Heidi', 'Ivan', '  Judy  '],
  5.     'email': ['alice@example.com', 'bob@example.com', 'charlie@example.com', 'david@example.com',
  6.               'eve@example.com', 'frank@example.com', 'grace@example.com', 'heidi@example.com',
  7.               'ivan@example.com', 'judy@example.com'],
  8.     'age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
  9.     'income': [50000, 60000, 70000, 80000, 90000, 100000, 110000, 120000, 130000, 140000],
  10.     'join_date': ['2020-01-01', '2020-02-15', '2020-03-30', '2020-05-01', '2020-06-15',
  11.                   '2020-07-30', '2020-09-01', '2020-10-15', '2020-11-30', '2021-01-01'],
  12.     'last_login': ['2023-01-01 09:00:00', '2023-01-02 10:30:00', '2023-01-03 11:45:00',
  13.                    '2023-01-04 13:15:00', '2023-01-05 14:30:00', '2023-01-06 15:45:00',
  14.                    '2023-01-07 16:00:00', '2023-01-08 17:15:00', '2023-01-09 18:30:00',
  15.                    '2023-01-10 19:45:00'],
  16.     'notes': ['Regular customer', 'Premium customer', 'VIP customer', 'Regular customer',
  17.               'New customer', 'Regular customer', 'VIP customer', 'Premium customer',
  18.               'Regular customer', 'New customer']
  19. })
  20. # 添加一些缺失值和异常值
  21. messy_data.loc[2, 'email'] = np.nan
  22. messy_data.loc[5, 'age'] = -1  # 异常年龄
  23. messy_data.loc[7, 'income'] = -50000  # 异常收入
  24. messy_data.loc[9, 'join_date'] = 'Invalid Date'  # 无效日期
  25. # 数据清洗
  26. cleaned_data = messy_data.copy()
  27. # 清理名称中的空格
  28. cleaned_data['name'] = cleaned_data['name'].str.strip()
  29. # 处理缺失的电子邮件
  30. cleaned_data['email'] = cleaned_data['email'].fillna('unknown@example.com')
  31. # 修复异常年龄
  32. cleaned_data.loc[cleaned_data['age'] < 0, 'age'] = np.nan
  33. cleaned_data['age'] = cleaned_data['age'].fillna(cleaned_data['age'].median())
  34. # 修复异常收入
  35. cleaned_data.loc[cleaned_data['income'] < 0, 'income'] = np.nan
  36. cleaned_data['income'] = cleaned_data['income'].fillna(cleaned_data['income'].median())
  37. # 转换日期
  38. cleaned_data['join_date'] = pd.to_datetime(cleaned_data['join_date'], errors='coerce')
  39. cleaned_data['last_login'] = pd.to_datetime(cleaned_data['last_login'])
  40. # 计算会员天数
  41. cleaned_data['days_as_member'] = (pd.Timestamp.now() - cleaned_data['join_date']).dt.days
  42. # 格式化数据以便导出
  43. export_data = cleaned_data.copy()
  44. export_data['join_date'] = export_data['join_date'].dt.strftime('%Y-%m-%d')
  45. export_data['last_login'] = export_data['last_login'].dt.strftime('%Y-%m-%d %H:%M:%S')
  46. export_data['income'] = export_data['income'].map('${:,.2f}'.format)
  47. # 导出清洗后的数据
  48. export_data.to_csv('cleaned_customer_data.csv',
  49.                   encoding='utf-8-sig',
  50.                   index=False)
  51. # 同时导出数据质量报告
  52. quality_report = pd.DataFrame({
  53.     'column': messy_data.columns,
  54.     'original_missing': messy_data.isnull().sum().values,
  55.     'cleaned_missing': cleaned_data.isnull().sum().values,
  56.     'data_type': cleaned_data.dtypes.astype(str).values
  57. })
  58. quality_report.to_csv('data_quality_report.csv',
  59.                     encoding='utf-8-sig',
  60.                     index=False)
复制代码

7. 总结

Pandas的to_csv()方法是数据分析师工具箱中的重要工具,掌握其各种参数和技巧可以大大提高工作效率。从基本的导出操作到高级的自定义格式处理,从解决常见编码问题到优化大型数据集的导出性能,本文详细介绍了Pandas导出CSV文件的各个方面。

在实际应用中,根据具体需求选择合适的导出策略至关重要。无论是生成简单的数据报告,还是处理复杂的多表关联数据,或是清洗大型数据集,Pandas都提供了灵活而强大的解决方案。通过本文介绍的各种技巧和最佳实践,您可以更加得心应手地处理数据导出任务,让数据分析工作更加高效和专业。

记住,CSV虽然是一种简单通用的格式,但在处理特殊字符、大数据集或需要精确格式控制的情况下,可能需要考虑其他格式如Parquet、Feather或Excel。选择最适合您需求的格式,将使您的数据处理工作流程更加顺畅。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则