簡體   English   中英

多列表理解 vs 單 for 循環

[英]Multiple list comprehension vs single for loop

我試圖了解在 python 中編碼的最佳實踐。 我有一個 Pandas 數據框,我需要處理包含字符串或浮點數的列,我正在做基本的數據管理,我想知道單個 for 循環是否可能比許多列表理解更快。

在我的情況下,目標數據框是 400 萬行或更多行,我有 10 個列表理解,所以速度很重要,我必須決定是將它寫在 for 循環還是許多列表理解中。 你有什么建議嗎?

for i in range(dataframe.shape[0]):
        try: #Price dummy
            if dataframe["Price"].iloc[i]=="0":
                dataframe["Price_Dummy"].iloc[i] = 0
            else:
                dataframe["Price_Dummy"].iloc[i] = 1
        except:
            pass
        try: #Transform everything in MB (middle unit)
            unit_of_measure = dataframe["Size"].iloc[i].split(" ")[-1].lower()
            size = float(dataframe["Size"].iloc[i].split(" ")[0])
            if unit_of_measure =="kb":
                dataframe["Size"].iloc[i] = size/1000
            elif unit_of_measure =="gb":
                dataframe["Size"].iloc[i] = size*1000
            else:
                dataframe["Size"].iloc[i] = size
        except:
            pass

(其他 10+ 項操作)

對比

列表理解相同

我找到了這個鏈接: 單列表迭代 vs 多列表理解

但這並不能說明列表推導式是否總是更快,而與考慮的迭代次數無關

我會嘗試使用np.where子句進行 if-elif-else 組合而不使用循環。 這通常很快。

import numpy as np

# dataframe is a DataFrame containing data
# Now this:

dataframe["Price"] = np.where(dataframe["Price_Dummy"] == "0",0,1)

# String operations work on whole string columns as well
unit_of_measure = dataframe["Size"].str.split(" ", expand=True)[1].lower()

size = dataframe["Size"].str.split(" ", expand=True)[0].astype("float")

kb_case = np.where(unit_of_measure =="kb", size/1000, size)
dataframe["Size"] = np.where(unit_of_measure =="gb", size*1000, kb_case)

注意,我取代了[-1]unit_of_measure =與線[1]作為expand=True選項不支持-1索引。 所以你必須知道你的單位在哪個位置結束。

可以在此處找到有關在 DataFrame 中拆分字符串的信息。

在最后兩行中,我復制了您必須自下而上創建的 if-elif-else 組合:如果單位為gb則您的最終結果dataframe["Size"]等於size*1000 如果不是,則等於kb_case ,其中包括單位為kb的情況以及所有其他情況。

暫無
暫無

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

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