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

如何优化Pandas代码?解决弃用警告与大数据查询性能问题

优化方案:替换循环为矢量化操作,解决性能与弃用警告问题

原代码的核心问题

  1. 性能极低:循环逐行遍历df_leads,每次都对50万行的df做布尔筛选+全局min(),时间复杂度为O(n²),数据量一大必然卡顿。
  2. 弃用警告:调用df.min()时未指定numeric_only参数,这是pandas新版本的强制要求——必须明确是否仅对数值列做聚合,原代码中其实只需要日期列的最小值,全局min()完全没必要。

优化后的代码

直接用groupby做分组聚合,再通过merge匹配到目标DataFrame,全程矢量化操作,性能提升几个数量级:

import pandas as pd

# 1. 从原始数据中按customer_lead_id分组,计算每个lead对应的最小创建日期
lead_min_dates = df.groupby('customer_lead_id')['created_date'].min().reset_index()
# 重命名列,和df_leads的列名匹配,方便后续合并
lead_min_dates.rename(columns={'customer_lead_id': 'Lead', 'created_date': 'Created Date'}, inplace=True)

# 2. 合并到df_leads,匹配Lead列,保留df_leads的所有行
df_leads = df_leads.merge(lead_min_dates, on='Lead', how='left')

额外优化建议

  • 读取CSV时优化内存:读取原始CSV时指定数据类型和日期解析,能减少内存占用,进一步提升速度:
    # 示例:根据实际情况调整dtype,比如customer_lead_id是字符串就用str,重复多可以用category
    df = pd.read_csv('your_raw_data.csv', parse_dates=['created_date'], dtype={'customer_lead_id': 'int64'})
    df_leads = pd.read_csv('your_leads_data.csv', dtype={'Lead': 'int64'})
    
  • 提前去重:如果原始df里customer_lead_id有大量重复,先对df按customer_lead_id去重再分组,能减少聚合计算的工作量:
    # 去重时保留每个customer_lead_id的最早日期(和我们要的结果一致)
    df_unique = df.sort_values('created_date').drop_duplicates('customer_lead_id', keep='first')
    # 再用这个去重后的df做合并,速度更快
    df_leads = df_leads.merge(df_unique[['customer_lead_id', 'created_date']].rename(columns={'customer_lead_id': 'Lead', 'created_date': 'Created Date'}), on='Lead', how='left')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:15:49