【发布时间】:2022-12-14 09:33:28
【问题描述】:
有人能帮我吗?
我有一个巨大的数据框(9 万行),我需要应用这个逻辑,但我只能考虑使用“for”循环来解决问题,这需要将近 2 个小时才能运行......可以有人告诉我如何优化代码吗?
逻辑如下: 对于每个“客户”,我需要检查他的“FinalKey”是否存在于“Key”列中。如果存在,则此客户的“最终名称”将与“客户”中重复次数最多的名称相同,对于“Key”中的相同“FinalKey”。 下面是一个例子:
创建数据框 df
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']=''
打印数据框
去向
| 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 | 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 | |
【问题讨论】:
-
请用文字解释最终名称的标准是什么
-
我不确定,但在 for 循环中使用 list(df['Key']) 可以表示每次都重建列表。在外面计算并使用结果。
标签: python pandas dataframe data-science