[英]Why is extracting a column from a pandas DataFrame as a list and performing list comprehension faster than using the map function?
在使用pandas DataFrames時,我觀察到使用列表理解將一列提取為列表,然后將其重新插入DataFrame的速度比使用map函數要快。
為了測試這一點,我創建了一個兩列數據框,一個數據框的數字從0到999,下一個數據框是這些數字的平方。 然后,添加一個多維數據集列,其值以兩種不同的方式計算。
數據框已創建。 數據幀有兩個副本。
import pandas as pd
import numpy as np
df = pd.DataFrame({'numbers':[x for x in range(1000)],'squares':[x*x for x in range(1000)]})
df2 = df.copy()
df3 = df.copy()
使用地圖功能:
%%timeit
# using map
df3['cubes'] = np.nan
df3['cubes'] = df3.numbers.map(lambda x: x**3)
當我在Jupyter筆記本中運行此文件時,花費的時間是
每個循環1.31 ms±7.7 µs(平均±標准偏差,共運行7次,每個循環1000個)
將列提取為列表,然后使用列表理解將其結果重新插入到數據框中:
%%timeit
df4['cubes'] = np.nan
L = list(df4.numbers)
df4['cubes'] = [x**3 for x in L]
當我在Jupyter筆記本中運行此文件時,花費的時間是
每個循環1.07 ms±3.19 µs(平均±標准偏差,共運行7次,每個循環1000個)
熊貓的功能不是靈丹妙葯。 它們中的一些被實現為在各種輸入上提供廣泛的功能,這涉及許多開銷。 此外,其中許多都是用python編寫的,在獲得最終結果之前,有許多功能層需要傳遞。
另一方面,列表推導是在純C語言中實現的,並且已被優化為fast 。
您使用的丑陋的map
版本如下所示:
temp = []
f = lambda x: x**3
for v in df3.numbers:
temp.append(f(v))
df3['cubes'] = temp
再加上更多的開銷。 但是,並非每種輸入類型都如此。 例如,使用Series
map
可能非常快。
請記住, 最快的方法是-
%timeit df.numbers ** 3
10000 loops, best of 3: 179 µs per loop
碰巧比兩個循環解決方案都快。 通常,在使用熊貓時,避免使用lambda和循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.