如何优化Pandas代码?解决弃用警告与大数据查询性能问题
优化方案:替换循环为矢量化操作,解决性能与弃用警告问题
原代码的核心问题
- 性能极低:循环逐行遍历
df_leads,每次都对50万行的df做布尔筛选+全局min(),时间复杂度为O(n²),数据量一大必然卡顿。 - 弃用警告:调用
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
相关产品推荐
相关产品推荐

