200字
Pandas操作Excel使用手册大全:从基础到精通
2025-11-12
2025-11-12

Pandas操作Excel使用手册大全:从基础到精通

在数据分析和处理中,Excel文件是最常见的数据格式之一。Pandas作为Python最强大的数据处理库,提供了丰富的Excel操作功能。本手册将全面介绍Pandas操作Excel的各种技巧,从基础读写到高级格式化,助你成为Excel数据处理专家。

目录

  1. 基础环境配置
  2. Excel文件读取
  3. Excel文件写入
  4. 多工作表操作
  5. 数据格式化与样式
  6. 高级功能
  7. 性能优化
  8. 常见问题解决
  9. 实战案例

1. 基础环境配置

必要库安装

# 基础库
pip install pandas

# Excel处理引擎
pip install openpyxl        # 支持.xlsx文件读写
pip install xlsxwriter      # 支持高级格式化功能
pip install xlrd           # 支持旧版.xls文件读取(可选)

导入库

import pandas as pd
import numpy as np
from datetime import datetime, date

# 可选:样式相关
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

2. Excel文件读取

2.1 基础读取

# 读取Excel文件
 df = pd.read_excel('data.xlsx')

# 读取指定工作表
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 读取多个工作表
dfs = pd.read_excel('data.xlsx', sheet_name=['Sheet1', 'Sheet2'])

# 读取所有工作表
dfs = pd.read_excel('data.xlsx', sheet_name=None)  # 返回字典

2.2 高级读取选项

# 指定读取范围
df = pd.read_excel('data.xlsx', usecols='A:C')  # 读取A到C列
df = pd.read_excel('data.xlsx', usecols=[0, 2, 4])  # 读取指定列索引
df = pd.read_excel('data.xlsx', nrows=100)  # 只读取前100行
df = pd.read_excel('data.xlsx', skiprows=3)  # 跳过前3行

# 指定索引列
df = pd.read_excel('data.xlsx', index_col=0)  # 第一列作为索引
df = pd.read_excel('data.xlsx', index_col='ID')  # 指定列名作为索引

# 处理缺失值
df = pd.read_excel('data.xlsx', na_values=['NA', 'N/A', 'null'])

# 指定数据类型
df = pd.read_excel('data.xlsx', dtype={'列名': str, '数值列': float})

# 解析日期列
df = pd.read_excel('data.xlsx', parse_dates=['日期列'])
df = pd.read_excel('data.xlsx', parse_dates={'日期时间': ['日期列', '时间列']})

2.3 不同引擎对比

# openpyxl引擎(默认,功能全面)
df = pd.read_excel('data.xlsx', engine='openpyxl')

# xlrd引擎(适合旧版.xls文件)
df = pd.read_excel('data.xls', engine='xlrd')

# odf引擎(支持.ods文件)
df = pd.read_excel('data.ods', engine='odf')

3. Excel文件写入

3.1 基础写入

# 基础写入
df.to_excel('output.xlsx', index=False)

# 写入指定工作表
df.to_excel('output.xlsx', sheet_name='数据表', index=False)

# 不写入列名
df.to_excel('output.xlsx', header=False, index=False)

# 追加模式(需要openpyxl引擎)
with pd.ExcelWriter('output.xlsx', mode='a', engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name='新工作表', index=False)

3.2 使用ExcelWriter

# 创建ExcelWriter对象
with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
    df1.to_excel(writer, sheet_name='数据1', index=False)
    df2.to_excel(writer, sheet_name='数据2', index=False)
    df3.to_excel(writer, sheet_name='数据3', index=False)

# 使用xlsxwriter引擎(支持更多格式化选项)
with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name='数据', index=False)
    
    # 获取工作簿和工作表对象
    workbook = writer.book
    worksheet = writer.sheets['数据']
    
    # 设置列宽
    worksheet.set_column('A:C', 20)
    
    # 添加格式
    header_format = workbook.add_format({
        'bold': True,
        'text_wrap': True,
        'valign': 'top',
        'fg_color': '#D7E4BD',
        'border': 1
    })
    
    # 应用表头格式
    for col_num, value in enumerate(df.columns.values):
        worksheet.write(0, col_num, value, header_format)

4. 多工作表操作

4.1 读取多工作表

# 方法1:读取所有工作表
all_sheets = pd.read_excel('data.xlsx', sheet_name=None)
for sheet_name, df in all_sheets.items():
    print(f"工作表: {sheet_name}")
    print(df.head())

# 方法2:读取指定工作表列表
sheets = ['销售数据', '库存数据', '客户数据']
dfs = pd.read_excel('data.xlsx', sheet_name=sheets)

# 访问特定工作表
sales_df = dfs['销售数据']
inventory_df = dfs['库存数据']

4.2 写入多工作表

# 创建多个工作表
with pd.ExcelWriter('report.xlsx', engine='openpyxl') as writer:
    # 写入不同数据到不同工作表
    sales_df.to_excel(writer, sheet_name='销售报表', index=False)
    inventory_df.to_excel(writer, sheet_name='库存报表', index=False)
    customer_df.to_excel(writer, sheet_name='客户信息', index=False)
    
    # 写入汇总数据
    summary_df.to_excel(writer, sheet_name='汇总统计', index=False)

# 添加工作表到现有文件
with pd.ExcelWriter('existing.xlsx', mode='a', engine='openpyxl', 
                   if_sheet_exists='replace') as writer:
    new_df.to_excel(writer, sheet_name='新数据', index=False)

5. 数据格式化与样式

5.1 使用Styler进行样式设置

# 创建样式化数据框
def highlight_max(s):
    is_max = s == s.max()
    return ['background-color: yellow' if v else '' for v in is_max]

def color_negative_red(val):
    color = 'red' if val < 0 else 'black'
    return f'color: {color}'

# 应用样式
styled_df = df.style.applymap(color_negative_red, subset=['数值列'])
styled_df = styled_df.apply(highlight_max, subset=['数值列'])

# 导出带样式的Excel
styled_df.to_excel('styled_output.xlsx', engine='openpyxl', index=False)

5.2 使用xlsxwriter进行高级格式化

# 使用xlsxwriter进行高级格式化
with pd.ExcelWriter('formatted_report.xlsx', engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name='数据', index=False)
    
    # 获取工作簿和工作表
    workbook = writer.book
    worksheet = writer.sheets['数据']
    
    # 定义格式
    header_format = workbook.add_format({
        'bold': True,
        'text_wrap': True,
        'valign': 'top',
        'fg_color': '#4F81BD',
        'font_color': 'white',
        'border': 1
    })
    
    money_format = workbook.add_format({'num_format': '¥#,##0.00'})
    date_format = workbook.add_format({'num_format': 'yyyy-mm-dd'})
    percent_format = workbook.add_format({'num_format': '0.00%'})
    
    # 获取数据维度
    max_row, max_col = df.shape
    
    # 应用表头格式
    for col_num, value in enumerate(df.columns.values):
        worksheet.write(0, col_num, value, header_format)
    
    # 设置列宽和格式
    worksheet.set_column('A:A', 15)  # 设置A列宽度
    worksheet.set_column('B:B', 12, date_format)  # B列使用日期格式
    worksheet.set_column('C:C', 15, money_format)  # C列使用货币格式
    worksheet.set_column('D:D', 10, percent_format)  # D列使用百分比格式
    
    # 添加条件格式
    worksheet.conditional_format(1, 2, max_row, 2, {  # C列
        'type': '3_color_scale',
        'min_color': '#F8696B',
        'mid_color': '#FFEB9C',
        'max_color': '#63BE7B'
    })
    
    # 添加数据条
    worksheet.conditional_format(1, 3, max_row, 3, {  # D列
        'type': 'data_bar',
        'bar_color': '#63C384'
    })

5.3 使用openpyxl进行单元格样式设置

from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

# 创建工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "样式示例"

# 添加数据到工作表
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)

# 定义样式
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="4F81BD", end_color="4F81BD", fill_type="solid")
border = Border(left=Side(style='thin'), right=Side(style='thin'), 
                top=Side(style='thin'), bottom=Side(style='thin'))
center_alignment = Alignment(horizontal='center', vertical='center')

# 应用表头样式
for cell in ws[1]:
    cell.font = header_font
    cell.fill = header_fill
    cell.border = border
    cell.alignment = center_alignment

# 设置列宽
for column in ws.columns:
    max_length = 0
    column_letter = column[0].column_letter
    for cell in column:
        try:
            if len(str(cell.value)) > max_length:
                max_length = len(str(cell.value))
        except:
            pass
    adjusted_width = min(max_length + 2, 50)
    ws.column_dimensions[column_letter].width = adjusted_width

# 保存文件
wb.save('styled_with_openpyxl.xlsx')

6. 高级功能

6.1 添加图表

import xlsxwriter

# 创建带图表的Excel文件
with pd.ExcelWriter('chart_report.xlsx', engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name='数据', index=False)
    
    workbook = writer.book
    worksheet = writer.sheets['数据']
    
    # 创建图表
    chart = workbook.add_chart({'type': 'column'})
    
    # 配置图表数据
    max_row = len(df) + 1
    chart.add_series({
        'name': ['数据', 0, 1],  # 系列名称
        'categories': ['数据', 1, 0, max_row, 0],  # X轴标签
        'values': ['数据', 1, 1, max_row, 1],  # Y轴数据
    })
    
    # 设置图表标题和轴标签
    chart.set_title({'name': '销售数据分析'})
    chart.set_x_axis({'name': '月份'})
    chart.set_y_axis({'name': '销售额'})
    
    # 插入图表
    worksheet.insert_chart('E2', chart)

6.2 数据透视表

# 创建数据透视表
pivot_table = pd.pivot_table(df, 
                           values=['销售额', '数量'], 
                           index=['地区'], 
                           columns=['产品类别'], 
                           aggfunc={'销售额': np.sum, '数量': np.mean},
                           fill_value=0)

# 写入数据透视表
with pd.ExcelWriter('pivot_report.xlsx', engine='openpyxl') as writer:
    # 写入原始数据
    df.to_excel(writer, sheet_name='原始数据', index=False)
    
    # 写入数据透视表
    pivot_table.to_excel(writer, sheet_name='数据透视表')

6.3 公式和计算

# 使用xlsxwriter添加公式
with pd.ExcelWriter('formula_report.xlsx', engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name='数据', index=False)
    
    workbook = writer.book
    worksheet = writer.sheets['数据']
    
    # 添加公式
    max_row = len(df) + 1
    worksheet.write(max_row, 1, '总计:', workbook.add_format({'bold': True}))
    worksheet.write(max_row, 2, f'=SUM(C2:C{max_row-1})')
    worksheet.write(max_row, 3, f'=SUM(D2:D{max_row-1})')
    
    # 添加平均值
    worksheet.write(max_row + 1, 1, '平均值:', workbook.add_format({'bold': True}))
    worksheet.write(max_row + 1, 2, f'=AVERAGE(C2:C{max_row-1})')
    worksheet.write(max_row + 1, 3, f'=AVERAGE(D2:D{max_row-1})')

7. 性能优化

7.1 大数据量处理

# 分批读取大文件
chunk_size = 10000
chunks = []

for chunk in pd.read_excel('large_file.xlsx', chunksize=chunk_size):
    # 处理每个chunk
    processed_chunk = chunk[chunk['销售额'] > 1000]  # 示例处理
    chunks.append(processed_chunk)

# 合并所有chunks
final_df = pd.concat(chunks, ignore_index=True)

# 写入文件(使用更快的引擎)
with pd.ExcelWriter('processed_large.xlsx', engine='xlsxwriter') as writer:
    final_df.to_excel(writer, sheet_name='处理结果', index=False)

7.2 内存优化

# 指定数据类型减少内存使用
dtype_dict = {
    '整数列': 'int32',
    '浮点列': 'float32',
    '字符串列': 'category',
    '日期列': 'datetime64[ns]'
}

df = pd.read_excel('data.xlsx', dtype=dtype_dict)

# 只读取需要的列
use_cols = ['需要的列1', '需要的列2', '需要的列3']
df = pd.read_excel('data.xlsx', usecols=use_cols)

7.3 并行处理

import concurrent.futures
import pandas as pd

def process_sheet(sheet_name):
    """处理单个工作表"""
    df = pd.read_excel('multi_sheet_file.xlsx', sheet_name=sheet_name)
    # 进行处理...
    return sheet_name, df

# 并行处理多个工作表
sheet_names = ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4']
results = {}

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    futures = [executor.submit(process_sheet, sheet) for sheet in sheet_names]
    
    for future in concurrent.futures.as_completed(futures):
        sheet_name, processed_df = future.result()
        results[sheet_name] = processed_df

# 写入结果
with pd.ExcelWriter('parallel_processed.xlsx', engine='openpyxl') as writer:
    for sheet_name, df in results.items():
        df.to_excel(writer, sheet_name=sheet_name, index=False)

8. 常见问题解决

8.1 编码问题

# 处理中文编码问题
try:
    df = pd.read_excel('chinese_file.xlsx', encoding='utf-8')
except UnicodeDecodeError:
    df = pd.read_excel('chinese_file.xlsx', encoding='gbk')

# 或者让pandas自动检测编码
df = pd.read_excel('file.xlsx')

8.2 数据类型问题

# 处理混合数据类型
df = pd.read_excel('mixed_types.xlsx', dtype=str)  # 全部读取为字符串

# 指定列的数据类型
dtype_dict = {'ID': str, '日期': str, '数值': float}
df = pd.read_excel('file.xlsx', dtype=dtype_dict)

# 处理日期时间
df = pd.read_excel('file.xlsx', parse_dates=['日期列'])

8.3 内存不足问题

# 分批处理大文件
chunk_size = 5000
result_chunks = []

for chunk in pd.read_excel('large_file.xlsx', chunksize=chunk_size):
    # 处理chunk
    processed = chunk.groupby('类别').sum()
    result_chunks.append(processed)

# 合并结果
final_result = pd.concat(result_chunks).groupby(level=0).sum()

8.4 文件锁定问题

# 确保正确关闭文件
try:
    with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
        df.to_excel(writer, sheet_name='数据', index=False)
        # 其他操作...
except Exception as e:
    print(f"错误: {e}")
finally:
    # 确保文件被正确关闭
    pass

9. 实战案例

9.1 销售数据报表生成

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# 生成示例数据
np.random.seed(42)
dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
regions = ['华北', '华东', '华南', '西南', '西北']
products = ['产品A', '产品B', '产品C', '产品D', '产品E']

# 创建销售数据
data = []
for date in dates:
    for region in regions:
        for product in products:
            sales = np.random.randint(100, 1000)
            quantity = np.random.randint(10, 100)
            data.append({
                '日期': date,
                '地区': region,
                '产品': product,
                '销售额': sales,
                '数量': quantity
            })

sales_df = pd.DataFrame(data)

# 生成销售报表
def generate_sales_report(df, output_file='sales_report.xlsx'):
    with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:
        workbook = writer.book
        
        # 原始数据
        df.to_excel(writer, sheet_name='原始数据', index=False)
        
        # 月度汇总
        monthly_summary = df.groupby([df['日期'].dt.to_period('M'), '地区']).agg({
            '销售额': 'sum',
            '数量': 'sum'
        }).reset_index()
        monthly_summary['日期'] = monthly_summary['日期'].astype(str)
        monthly_summary.to_excel(writer, sheet_name='月度汇总', index=False)
        
        # 产品分析
        product_analysis = df.groupby('产品').agg({
            '销售额': ['sum', 'mean', 'std'],
            '数量': ['sum', 'mean', 'std']
        }).round(2)
        product_analysis.to_excel(writer, sheet_name='产品分析')
        
        # 地区分析
        region_analysis = df.groupby('地区').agg({
            '销售额': 'sum',
            '数量': 'sum'
        }).reset_index()
        region_analysis.to_excel(writer, sheet_name='地区分析', index=False)
        
        # 格式化工作表
        for sheet_name in ['月度汇总', '地区分析']:
            worksheet = writer.sheets[sheet_name]
            
            # 设置列宽
            worksheet.set_column('A:A', 15)
            worksheet.set_column('B:E', 12)
            
            # 添加货币格式
            money_format = workbook.add_format({'num_format': '¥#,##0.00'})
            worksheet.set_column('C:C', 12, money_format)
            
            # 添加数据条
            max_row = len(worksheet.tables.get(sheet_name, [])) + 1
            worksheet.conditional_format(1, 2, max_row, 2, {
                'type': 'data_bar',
                'bar_color': '#63C384'
            })

# 生成报表
generate_sales_report(sales_df)
print("销售报表生成完成!")

9.2 财务报表自动化

def generate_financial_report(transactions_df, output_file='financial_report.xlsx'):
    """生成财务报表"""
    
    with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:
        workbook = writer.book
        
        # 1. 原始交易数据
        transactions_df.to_excel(writer, sheet_name='交易明细', index=False)
        
        # 2. 月度收支汇总
        monthly_cashflow = transactions_df.groupby([
            transactions_df['日期'].dt.to_period('M'),
            '类别'
        ])['金额'].sum().unstack(fill_value=0)
        monthly_cashflow.to_excel(writer, sheet_name='月度收支')
        
        # 3. 资产负债表
        balance_sheet = transactions_df.groupby('账户').agg({
            '金额': 'sum'
        }).reset_index()
        balance_sheet.to_excel(writer, sheet_name='资产负债表', index=False)
        
        # 4. 收支趋势
        daily_trend = transactions_df.groupby(transactions_df['日期'].dt.date)['金额'].sum()
        daily_trend.to_excel(writer, sheet_name='收支趋势')
        
        # 格式化
        formats = {
            '货币': workbook.add_format({'num_format': '¥#,##0.00'}),
            '百分比': workbook.add_format({'num_format': '0.00%'}),
            '日期': workbook.add_format({'num_format': 'yyyy-mm-dd'}),
            '表头': workbook.add_format({
                'bold': True,
                'fg_color': '#4F81BD',
                'font_color': 'white'
            })
        }
        
        # 应用格式到各个工作表
        for sheet_name in writer.sheets:
            worksheet = writer.sheets[sheet_name]
            
            # 设置列宽
            worksheet.set_column('A:Z', 15)
            
            # 应用货币格式到金额列
            if sheet_name == '交易明细':
                worksheet.set_column('C:C', 15, formats['货币'])
                worksheet.set_column('A:A', 12, formats['日期'])
            elif sheet_name == '资产负债表':
                worksheet.set_column('B:B', 15, formats['货币'])

# 生成示例财务数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', '2024-12-31', freq='D')
categories = ['工资', '餐饮', '交通', '购物', '娱乐', '医疗', '教育', '其他']
accounts = ['现金', '银行卡', '信用卡', '支付宝', '微信']

financial_data = []
for date in dates[:500]:  # 生成500条记录
    amount = np.random.randint(-500, 2000)
    category = np.random.choice(categories)
    account = np.random.choice(accounts)
    description = f'{category}支出' if amount < 0 else f'{category}收入'
    
    financial_data.append({
        '日期': date,
        '描述': description,
        '金额': amount,
        '类别': category,
        '账户': account
    })

financial_df = pd.DataFrame(financial_data)

# 生成财务报告
generate_financial_report(financial_df)
print("财务报表生成完成!")

9.3 数据清洗和验证

def clean_and_validate_excel(input_file, output_file='cleaned_data.xlsx'):
    """清洗和验证Excel数据"""
    
    # 读取数据
    df = pd.read_excel(input_file)
    
    # 数据清洗
    print("开始数据清洗...")
    
    # 1. 删除空行
    initial_rows = len(df)
    df = df.dropna(how='all')
    print(f"删除空行: {initial_rows - len(df)} 行")
    
    # 2. 处理重复数据
    duplicates = df.duplicated().sum()
    df = df.drop_duplicates()
    print(f"删除重复数据: {duplicates} 行")
    
    # 3. 处理缺失值
    missing_before = df.isnull().sum().sum()
    
    # 数值列用中位数填充
    numeric_columns = df.select_dtypes(include=[np.number]).columns
    for col in numeric_columns:
        df[col].fillna(df[col].median(), inplace=True)
    
    # 字符串列用众数填充
    string_columns = df.select_dtypes(include=['object']).columns
    for col in string_columns:
        if not df[col].mode().empty:
            df[col].fillna(df[col].mode()[0], inplace=True)
    
    missing_after = df.isnull().sum().sum()
    print(f"处理缺失值: {missing_before - missing_after} 个")
    
    # 4. 数据类型转换
    # 尝试将合适的列转换为数值类型
    for col in df.columns:
        if df[col].dtype == 'object':
            try:
                # 尝试转换为数值
                df[col] = pd.to_numeric(df[col], errors='ignore')
            except:
                pass
            
            # 尝试转换为日期
            if '日期' in col or '时间' in col or 'date' in col.lower():
                try:
                    df[col] = pd.to_datetime(df[col], errors='ignore')
                except:
                    pass
    
    # 5. 数据验证
    validation_results = {}
    
    # 数值范围验证
    for col in numeric_columns:
        if col in df.columns:
            min_val = df[col].min()
            max_val = df[col].max()
            validation_results[col] = {
                '最小值': min_val,
                '最大值': max_val,
                '异常值数量': ((df[col] < 0) | (df[col] > 1000000)).sum()
            }
    
    # 字符串长度验证
    for col in string_columns:
        if col in df.columns:
            max_length = df[col].astype(str).str.len().max()
            validation_results[col] = {
                '最大长度': max_length,
                '空字符串数量': (df[col] == '').sum()
            }
    
    print("数据验证完成")
    
    # 生成清洗报告
    with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:
        # 清洗后的数据
        df.to_excel(writer, sheet_name='清洗后数据', index=False)
        
        # 数据质量报告
        quality_report = pd.DataFrame({
            '指标': ['总行数', '总列数', '重复行数', '缺失值总数', '数值列数', '字符串列数'],
            '数值': [len(df), len(df.columns), duplicates, missing_after, 
                    len(numeric_columns), len(string_columns)]
        })
        quality_report.to_excel(writer, sheet_name='数据质量报告', index=False)
        
        # 验证结果
        if validation_results:
            validation_df = pd.DataFrame.from_dict(validation_results, orient='index')
            validation_df.to_excel(writer, sheet_name='验证结果')
        
        # 格式化
        workbook = writer.book
        
        # 设置数据格式
        data_worksheet = writer.sheets['清洗后数据']
        data_worksheet.set_column('A:Z', 15)
        
        # 设置报告格式
        report_worksheet = writer.sheets['数据质量报告']
        report_worksheet.set_column('A:B', 20)
        
        # 添加条件格式
        if len(df) > 0:
            # 为数值列添加颜色刻度
            for col_num, col_name in enumerate(df.columns):
                if col_name in numeric_columns:
                    data_worksheet.conditional_format(1, col_num, len(df), col_num, {
                        'type': '3_color_scale',
                        'min_color': '#F8696B',
                        'mid_color': '#FFEB9C',
                        'max_color': '#63BE7B'
                    })
    
    print(f"清洗完成!输出文件: {output_file}")
    return df

# 生成示例脏数据用于测试
def create_dirty_data():
    """创建包含各种数据质量问题的示例数据"""
    np.random.seed(42)
    
    data = []
    for i in range(100):
        # 故意制造一些数据质量问题
        
        # 空值
        if i % 10 == 0:
            name = None
        else:
            name = f'产品{i}'
        
        # 重复数据
        if i % 15 == 0:
            name = '产品1'  # 重复名称
        
        # 异常数值
        price = np.random.randint(10, 1000)
        if i % 20 == 0:
            price = -999  # 异常负值
        elif i % 25 == 0:
            price = 999999  # 异常大值
        
        # 格式不一致的日期
        if i % 12 == 0:
            date = '2024-13-45'  # 无效日期
        else:
            date = pd.Timestamp('2024-01-01') + pd.Timedelta(days=i)
        
        # 空字符串
        category = '' if i % 8 == 0 else f'类别{i % 5}'
        
        data.append({
            'ID': i if i % 5 != 0 else None,  # 空ID
            '名称': name,
            '价格': price,
            '日期': date,
            '类别': category,
            '数量': np.random.randint(1, 100) if i % 7 != 0 else None
        })
    
    # 添加完全重复的行
    data.extend(data[:5])
    
    return pd.DataFrame(data)

# 创建脏数据
dirty_df = create_dirty_data()
dirty_df.to_excel('dirty_data.xlsx', index=False)
print("脏数据文件创建完成: dirty_data.xlsx")

# 清洗数据
cleaned_df = clean_and_validate_excel('dirty_data.xlsx')
print("数据清洗完成!")

总结

本手册涵盖了Pandas操作Excel的方方面面,从基础读写到高级格式化,从性能优化到实际应用。掌握这些技能将大大提升你的数据处理效率。

最佳实践建议:

  1. 选择合适的引擎

    • openpyxl:通用性强,支持读写
    • xlsxwriter:格式化功能强大,只支持写入
    • xlrd:适合处理旧版.xls文件
  2. 注意性能优化

    • 使用chunksize处理大文件
    • 指定合适的数据类型
    • 只读取需要的列
  3. 数据质量保证

    • 处理缺失值和异常值
    • 验证数据类型和格式
    • 添加数据清洗步骤
  4. 格式化技巧

    • 使用条件格式突出重点数据
    • 合理设置列宽和行高
    • 添加图表增强可视化效果

希望这份手册能帮助你在数据处理工作中更加得心应手!


参考资料:

  • Pandas官方文档: https://pandas.pydata.org/docs/
  • XlsxWriter文档: https://xlsxwriter.readthedocs.io/
  • OpenPyXL文档: https://openpyxl.readthedocs.io/
Pandas操作Excel使用手册大全:从基础到精通
作者
一晌小贪欢
发表于
2025-11-12
License
CC BY-NC-SA 4.0

评论