如何对两个DataFrame高效执行join与groupby统计客户服务数量
性能优化方案
你原有方案耗时过高的核心原因是使用了逐行遍历逻辑,时间复杂度达到O(n*m)(n是ServicesA行数、m是ServicesB的客户数),大数据量下性能极差。使用pandas原生向量化操作即可把性能提升几个数量级,实现代码如下:
import pandas as pd # 第一步:统计ServicesA中每个客户的服务数量 service_a_cnt = df_ServicesA.groupby('clientID', as_index=False)['ServiceID_A'].count() # 统一列名方便后续关联 service_a_cnt.columns = ['ClientID', 'count(ServiceID_A)'] # 第二步:提取ServicesB中的唯一客户列表 service_b_clients = df_ServicesB[['ClientID']].drop_duplicates() # 改名为期望的输出列名 service_b_clients.columns = ['ClientID With ServiceID_B'] # 第三步:左关联填充统计值,无匹配的客户填充0 result = service_b_clients.merge( service_a_cnt, left_on='ClientID With ServiceID_B', right_on='ClientID', how='left' ).drop(columns='ClientID') # 空值补0并转为整数类型 result['count(ServiceID_A)'] = result['count(ServiceID_A)'].fillna(0).astype(int) # 重置索引和预期输出格式一致 result = result.reset_index(drop=True)
方案说明
- 所有操作均为pandas底层C实现的向量化运算,时间复杂度降至O(n + m),即使百万级数据量也可以在秒级完成运算
- 无需自定义遍历函数,完全符合Python pandas生态的最佳实践
- 最终输出的result结构和你期望的结果完全一致
内容的提问来源于stack exchange,提问作者Francisco Cortes
相关产品推荐
相关产品推荐

