You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化Pandas数据匹配代码运行时长:40万行数据提速咨询

提速方案:处理40万行DataFrame匹配的性能优化

问题背景

现有40万行的数据集,需通过Postcode匹配两个DataFrame并关联CCG字段,当前代码可实现需求但耗时4.5分钟,需优化运行速度。

核心优化方向及代码示例

1. 批量读取Excel工作表,减少IO开销

原代码逐个读取每个工作表,多次打开/关闭Excel文件是主要耗时点之一。改用pd.ExcelFile一次性加载文件,再遍历目标工作表,大幅降低IO次数:

import time
import pandas as pd

start = time.time()

# 一次性加载整个Excel文件,避免重复IO操作
with pd.ExcelFile('CCG_Codes.xlsx') as xls:
    # 定义需要读取的工作表列表
    target_sheets = [
        'East of England',
        'London Commissioning Region',
        'Midlands Commissioning Region',
        'North East and Yorkshire Commis',
        'North West Commissioning Region',
        'South East Commissioning Region',
        'South West Commissioning Region',
        'Channel Islands and Isle of Man',
        'Wales, Scotland and Northern Ir'
    ]
    # 批量读取所有目标工作表
    df_list = []
    for sheet in target_sheets:
        df = pd.read_excel(xls, sheet_name=sheet, usecols=['Postcode', 'CCG'], dtype={'Postcode': str})
        df_list.append(df)
    dfAll = pd.concat(df_list, ignore_index=True)

# 读取主数据集
df1 = pd.read_excel('Residence_CCG_Check_M9.xlsx', sheet_name='Sheet1', dtype={'Postcode': str})

# 统一Postcode格式(去除空格、大写化,避免格式不匹配导致的无效计算)
df1['Postcode'] = df1['Postcode'].str.strip().str.upper()
dfAll['Postcode'] = dfAll['Postcode'].str.strip().str.upper()

# 合并时关闭默认排序,减少不必要的计算开销
merged_df = pd.merge(df1, dfAll, on='Postcode', how='left', sort=False)
# 注:原代码的rename操作多余,仅当df1本身包含CCG列时才需要,此处可省略
merged_df.to_excel("ResidenceCheck.xlsx", index=False, header=True)

end = time.time()
print(f"耗时:{end - start:.2f}秒")

2. 格式统一预处理

Postcode存在大小写、前后空格等差异时,会导致merge时的无效匹配,同时统一格式后,pandas的哈希匹配效率会显著提升,这一步是必须的优化项。

3. 替换Excel为更高效的文件格式(长期优化)

Excel读写本身速度较慢,如果后续流程允许,建议将数据集转换为Parquet或CSV格式:

  • Parquet是列式存储,压缩率高、读取速度极快,适合大数据量:
    # 首次转换并保存为Parquet
    dfAll.to_parquet('CCG_Codes.parquet', index=False)
    df1.to_parquet('Residence_CCG_Check_M9.parquet', index=False)
    # 后续直接读取Parquet
    dfAll = pd.read_parquet('CCG_Codes.parquet')
    df1 = pd.read_parquet('Residence_CCG_Check_M9.parquet')
    
  • CSV读写速度也远快于Excel,适合不需要保留Excel格式的场景。

4. 去重预处理

如果dfAll中存在重复的Postcode记录,提前去重可以减少merge时的计算量:

dfAll = dfAll.drop_duplicates(subset='Postcode', keep='first')

内容的提问来源于stack exchange,提问作者Easha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:21:02