【问题标题】:Is there a better way to replace the "for" loop in python?有没有更好的方法来替换 python 中的“for”循环?
【发布时间】: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


【解决方案1】:

是的,有一些方法可以优化您的代码以避免使用 for 循环。一种方法是使用 Pandas 中的 apply() 方法,它允许您将函数应用于数据框中的每一行。

以下是如何使用 apply() 方法解决问题的示例:

def get_final_name(row):
    if row['FinalKey'] in df['Key'].tolist():
        return df[df['Key'] == row['FinalKey']]['Customer'].value_counts().idxmax()
    else:
        return ""

df['Final Name'] = df.apply(get_final_name, axis=1)

优化代码的另一种方法是使用 Pandas 中的 merge() 方法将 df['FinalKey'] 列中的数据与 df['Key'] 列中的数据合并。这将允许您完全避免使用 for 循环。

以下是如何使用 merge() 方法解决问题的示例:

df_merged = df[['FinalKey', 'Customer']].merge(df[['Key', 'Customer']], on='Key', how='inner')
df['Final Name'] = df_merged.groupby('FinalKey')['Customer'].apply(lambda x: x.value_counts().idxmax())

这些解决方案应该比使用 for 循环快得多,因为它们利用了 Pandas 中内置的优化方法。

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2012-02-12
    • 2021-11-12
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多