簡體   English   中英

為什么從pandas DataFrame中提取列作為列表並比使用map函數更快地執行列表理解?

[英]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()

情況1

使用地圖功能:

%%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.

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