[英]Is there a better way to replace the "for" loop in python?
有人能帮我吗?
我有一个巨大的数据框要处理(9 万行),我需要应用这个逻辑,但我只能考虑使用“for”循环来解决问题,这需要将近 2 个小时才能运行......可以有人告诉我如何优化代码吗?
逻辑如下:对于每个'Customer',我需要检查'Key'列中是否存在他的'FinalKey'。 如果存在,则此客户的“最终名称”将与“客户”中重复次数最多的名称相同,对于“Key”中的相同“FinalKey”。 下面是一个例子:
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']=''
去向
顾客 | 钥匙 | 最终密钥 | 最终名称 |
---|---|---|---|
汤姆 | 123 | 123 | |
汤姆 | 54 | 123 | |
汤姆 | 21 | 123 | |
汤姆2 | 123 | 123 | |
汤姆3 | 123 | 123 | |
汤姆3 | 123 | 123 | |
约翰 | 45 | 45 | |
玛丽 | 41 | 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'] = ""
去向
| 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 | |
我确定有更好的方法,但这有效:
top_cust_by_key = df[['Key', 'Customer']].groupby('Key').agg(lambda x: x.value_counts().index[0])['Customer']
df['Final Name'] = df['FinalKey'].map(top_cust_by_key)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.