簡體   English   中英

為什么我的帶有 if else 子句的 for 循環運行得這么慢?

[英]Why does my for loop with if else clause run so slow?

TL,DR :我試圖理解為什么下面的 for 循環非常慢,需要數小時才能在 160K 條目的數據集上運行。

我有一個使用 function 和 .apply() 的工作解決方案,但我想了解為什么我的本土解決方案如此糟糕。 我顯然是 Python 的初學者:

popular_or_not = []
counter = 0
for id in df['id']:
    if df['popularity'][df['id'] == id].values == 0:
        popular_or_not.append(0)
    else:
        popular_or_not.append(1)
    counter += 1

df['popular_or_not'] = popular_or_not
df

更詳細地說:

我目前正在學習 Python 的數據科學,我正在查看 Kaggle 上的這個數據集: https://www.kaggle.com/yamaerenay/spotify-dataset-19212020-160k-tracks

我對預測/建模流行度分數很感興趣。 不是正態分布的:

plt.bar(df['popularity'].value_counts().index, df['popularity'].value_counts().values)

在此處輸入圖像描述

我想加一個欄目,說一首歌曲是否流行,流行歌曲是那些得分在5及以上的歌曲,不受歡迎的歌曲是其他歌曲。

我嘗試了以下解決方案,但運行速度非常慢,我不知道為什么。 它在一個非常小的子集上運行良好,但在完整數據集上運行需要幾個小時:

popular_or_not = []
counter = 0
for id in df['id']:
    if df['popularity'][df['id'] == id].values == 0:
        popular_or_not.append(0)
    else:
        popular_or_not.append(1)
    counter += 1

df['popular_or_not'] = popular_or_not
df

這種替代解決方案工作正常:

def check_popularity(score):
    if score > 5:
        return 1
    else:
        #pdb.set_trace()
        return 0
df['popularity'].apply(check_popularity).value_counts()
df['popular_or_not'] = df['popularity'].apply(check_popularity)

我認為理解為什么我的第一個解決方案不起作用可能是我學習 Python 的重要部分。

感謝大家的意見。 我將在下面總結它們作為我問題的答案,但如果有任何不正確之處,請隨時加入:

我最初的 for 循環如此緩慢的原因是我檢查了 df['id'] == id 160k 次。 這通常是一個非常緩慢的操作。

對於這種類型的操作,與其對 pandas dataframe 進行數千次迭代,不如考慮應用矢量化 - 一組工具和方法在一條指令中以 Z0D61F8370CAD1D412F5 的速度處理一整列。 這就是我使用以下代碼所做的:

def check_popularity(score):
    if score > 5:
        return 1
    else:
        #pdb.set_trace()
        return 0
df['popularity'].apply(check_popularity).value_counts()
df['popular_or_not'] = df['popularity'].apply(check_popularity)

通過使用.apply 和一個預定義的 function。 我得到了相同的結果,但在幾秒鍾而不是幾小時內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM