如何优化Pandas中处理9万行DataFrame的for循环逻辑?
优化大型DataFrame的分组统计逻辑
问题背景
处理包含9万行的DataFrame时,使用for循环实现逻辑耗时近2小时,需要优化。核心需求:
- 对每条记录,检查
FinalKey是否存在于Key列中 - 若存在,将
Final Name设为Key等于该FinalKey的分组里,出现次数最多的Customer名称 - 若不存在,
Final Name设为空字符串
示例数据
创建示例DataFrame
import pandas as pd data = [['Tom','123', '123'], ['Tom', '54', '123'], ['Tom', '21', '123'], ['Tom2', '123', '123'], ['Tom3', '123', '123'], ['Tom3', '123', '123'], ['John', '45', '45'], ['Mary', '23', '41']] df = pd.DataFrame(data, columns=['Customer', 'Key', 'FinalKey']) df['Final Name']=''
初始DataFrame
| Customer | Key | FinalKey | Final Name |
|---|---|---|---|
| Tom | 123 | 123 | |
| Tom | 54 | 123 | |
| Tom | 21 | 123 | |
| Tom2 | 123 | 123 | |
| Tom3 | 123 | 123 | |
| Tom3 | 123 | 123 | |
| John | 45 | 45 | |
| Mary | 23 | 41 |
原低效代码
for i in range(0, len(df['Customer'])): if str(df.loc[i, 'FinalKey']) in list(df['Key']): df.loc[i, 'Final Name'] = df[df['Key']==df.loc[i, 'FinalKey']]['Customer'].value_counts().idxmax() else: df.loc[i, 'Final Name'] = ""
低效原因:循环中每次重复执行切片筛选、频次统计操作,且in list(df['Key'])每次都是O(n)复杂度,整体时间复杂度为O(n²),9万行数据会产生大量冗余计算。
优化方案
利用pandas向量化操作+预计算映射表,将时间复杂度降至O(n):
步骤1:预生成Key到对应最频繁Customer的映射字典
一次性统计每个Key分组内出现次数最多的Customer,存入字典:
# 按Key分组,提取每个分组中Customer的众数(出现次数最多的项) key_to_top_customer = df.groupby('Key')['Customer'].agg(lambda x: x.value_counts().idxmax()).to_dict()
步骤2:批量映射赋值
直接通过FinalKey匹配字典值,不存在则填充为空字符串:
df['Final Name'] = df['FinalKey'].map(key_to_top_customer).fillna('')
优化后结果
| Customer | Key | FinalKey | Final Name |
|---|---|---|---|
| Tom | 123 | 123 | Tom3 |
| Tom | 54 | 123 | Tom3 |
| Tom | 21 | 123 | Tom3 |
| Tom2 | 123 | 123 | Tom3 |
| Tom3 | 123 | 123 | Tom3 |
| Tom3 | 123 | 123 | Tom3 |
| John | 45 | 45 | John |
| Mary | 23 | 41 |
内容的提问来源于stack exchange,提问作者Amanda Calvo
相关产品推荐
相关产品推荐

