[英]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.