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

Python Pandas 实战:处理百万级数据关联与清洗的避坑指南

前言

在日常的数据处理工作中,我们经常面临这样的场景:手里有一份几万行的业务 Excel 表,需要去关联另外两份几十万甚至上百万行的 CSV 数据源(比如物料主数据、历史订单表),取出对应的字段追加到原表中。

如果直接用 Excel 的 VLOOKUPXLOOKUP,面对百万级数据,卡顿、崩溃几乎是常态。而使用 Python 的 pandas 库,不仅速度快,逻辑也更清晰。

本文将以一个实际的业务需求为例,记录如何使用 Pandas 高效完成多表关联(Merge)、时间戳转换以及解决最常见的“数据行数膨胀”问题。

业务场景

我们需要处理三个文件:

  1. 主表 (Excel):约 2 万行,包含导入报错的订单信息。
  2. 物料映射表 (CSV):约 34 万行,用于将 ITEM_CODE 转换为 OLD_PARTNUMBER
  3. 旧订单表 (CSV):约 133 万行,用于根据 订单号 + 旧物料号 获取历史订单的日期和行号信息。

目标:将文件 2 和 3 的信息匹配到文件 1 中,并导出结果。

核心技术点

在使用 Pandas 处理此类任务时,有几个关键点决定了脚本的健壮性和效率。

1. 内存优化与类型安全

读取百万行 CSV 时,如果全部读取,内存消耗巨大。同时,Excel 中的订单号可能是数字格式(如 123),而 CSV 读取出来可能是字符串("123")或者浮点数(123.0),直接关联会导致匹配失败。

最佳实践

  • 使用 usecols 只读取需要的列。
  • 使用 dtype=str 强制指定关联键为字符串,防止精度丢失或类型不匹配。
# 读取百万级 CSV 的正确姿势
df_orders = pd.read_csv('XX_ONT_SCHEDULING_T.csv',usecols=['ORDER_NUMBER', 'OLD_PARTNUMBER', 'PROMISE_DATE'], # 只读需要的列dtype=str, # 强制全为字符串,避免 001 变成 1,或长数字变成科学计数法skipinitialspace=True
)# 清洗空格(非常重要,CSV常带有隐形空格)
df_orders['ORDER_NUMBER'] = df_orders['ORDER_NUMBER'].str.strip()

2. 处理时间戳(向量化操作)

原始数据中包含毫秒级时间戳(如 1.70969E+12),需要转为日期格式。尽量避免使用 for 循环,利用 Pandas 的向量化操作效率更高。

# 将毫秒时间戳列批量转换为日期字符串
def convert_ms_to_date(ts):try:if pd.isna(ts) or ts == '': return Nonereturn pd.to_datetime(ts, unit='ms').strftime('%Y-%m-%d %H:%M:%S')except: return None# apply 应用到整列
df_main['日期'] = df_main['时间戳列'].apply(convert_ms_to_date)

3. 多键关联 (Merge/Join)

Pandas 的 merge 相当于 SQL 中的 JOIN。本例中需要基于两个字段确定唯一性。

# 相当于 SQL: LEFT JOIN ON t1.order_num = t2.order_num AND t1.part = t2.part
df_final = pd.merge(df_main,df_orders,on=['ORDER_NUMBER', 'OLD_PARTNUMBER'], # 双键关联how='left'
)

遇到的坑:关联后行数膨胀

这是新手最容易遇到的问题。

  • 现象:主表原有 1.7 万行,关联后变成了 2.5 万行。
  • 原因:这是一对多(1-to-N)关联导致的。参照表(CSV)中,关联键不唯一。例如同一个订单号和物料号,在历史表中可能有两条记录(比如曾经做过拆行处理)。
  • 后果:主表的一行被复制了多次,导致数据重复统计。

解决方案:在 Merge 之前,必须对右表(参照表)进行去重

# 核心代码:去重
# subset指定根据哪些列去重,keep='first'表示保留第一条
df_orders.drop_duplicates(subset=['ORDER_NUMBER', 'OLD_PARTNUMBER'], keep='first', inplace=True
)# 再次关联,行数即可保持完全一致

完整代码示例

基于 Python 3.10 的完整处理逻辑如下:

import pandas as pd
import osdef process_data():# 1. 读取主表df_main = pd.read_excel('Input_File.xlsx')original_count = len(df_main)# 统一关联键格式df_main['ITEM_CODE'] = df_main['ITEM_CODE'].astype(str).str.strip()# 2. 读取参照表并去重 (关键步骤)df_items = pd.read_csv('Items.csv', dtype=str, usecols=['ITEM_CODE', 'OLD_PART'])# 确保 ITEM_CODE 唯一,否则主表会膨胀df_items.drop_duplicates(subset=['ITEM_CODE'], keep='first', inplace=True)# 3. 第一次关联df_step1 = pd.merge(df_main, df_items, on='ITEM_CODE', how='left')# 4. 读取历史订单表并去重df_history = pd.read_csv('History.csv', dtype=str)# 确保 订单号+物料号 唯一df_history.drop_duplicates(subset=['ORDER_NUMBER', 'OLD_PART'], keep='first', inplace=True)# 5. 第二次关联df_final = pd.merge(df_step1, df_history, on=['ORDER_NUMBER', 'OLD_PART'], how='left')# 6. 校验与输出if len(df_final) == original_count:print("校验通过:行数未发生变化")df_final.to_excel('Output_Result.xlsx', index=False)else:print(f"警告:行数发生改变 (原: {original_count} -> 现: {len(df_final)})")if __name__ == '__main__':process_data()

总结

Pandas 在处理中等规模数据(百万行级别)时,是 Excel 最好的替代品。在写脚本时,只要注意以下三点,就能避开 90% 的坑:

  1. 类型对齐:关联键统一转为 str 再 Merge。
  2. 去重处理:在 left join 之前,务必确保右表的关联键是唯一的(drop_duplicates)。
  3. 按需读取:大文件只读需要的列,节省内存。

希望这篇文章能对大家处理数据有所帮助。

http://www.jsqmd.com/news/187962/

相关文章:

  • 如何将腾讯混元OCR嵌入Web应用:基于HTML和JS的实现路径
  • vue+uniapp+springboot健康生活助手活动报名微信小程序的可视化
  • 印象助手发布更新v1.2.5
  • HuggingFace镜像网站同步腾讯混元OCR模型提升下载速度
  • 2025年目前口碑好的聚酯尼龙袋销售厂家口碑排行,包装袋/聚酯尼龙袋/八边封包装袋,聚酯尼龙袋定制厂家有哪些 - 品牌推荐师
  • vue+uniapp+springboot基于小程序的企业员工考勤打卡系统设计与实现-
  • 瑞芯微刷openwrt串口不能输入问题,openwrt串口显示正常,但是输入故障,根源是rockchip的设备树问题!
  • 【C#高手进阶必读】:深度剖析Span在高并发场景中的应用
  • 企业私有化部署方案:如何在内网环境中运行腾讯混元OCR
  • 从零构建C#拦截器,轻松实现HTTP/HTTPS流量捕获与分析
  • 【C#企业系统模块设计精髓】:掌握高内聚低耦合的5大核心原则
  • 揭秘C#跨平台日志难题:如何在Linux、macOS和Windows统一输出日志?
  • 【C# 高级编程实战】:揭秘交错数组初始化背后的内存分配机制
  • 希尔排序采用“增量分组插入排序”的策略
  • 建筑图纸信息提取:施工图中标注文字识别与BIM系统对接
  • 政务大厅智能化:居民办事材料现场扫描即时结构化输出
  • 【C#跨平台开发必杀技】:如何实现高效方法拦截与AOP编程
  • C# 交错数组初始化完全解析(从基础到高性能实践)
  • 瑞芯微刷openwrt串口不能输入问题,根源是设备树问题!
  • 海洋科考船日志:航海手稿OCR识别保存珍贵历史资料
  • C# 交错数组如何正确初始化?90%开发者忽略的3个关键细节
  • 多语种文字识别神器!腾讯混元OCR支持超100种语言精准提取
  • 气象观测站数据:人工记录天气日志OCR识别补全自动化缺失
  • 【路径规划】基于概率路标图PRM 快读搜索随机树RRT实现机器人路径规划附matlab代码
  • 揭秘C#模块化架构设计:如何构建可扩展的企业级系统?
  • 揭秘C# Span底层原理:如何实现零分配高效数据处理
  • 【路径规划】比较不同预测模型(恒速模型、恒加速模型、概率预测模型和无预测模型)对轨迹规划性能的影响附Matlab代码
  • 跨境电商助力:多语言商品说明书OCR识别解决方案
  • 宠物医院档案电子化:宠物病历本手写内容OCR识别录入
  • 【C#跨平台日志输出终极指南】:掌握5种高效日志策略,提升系统可观测性