優化Pandas DataFrame的處理速度

背景

本文的內容主要來源於A Beginner’s Guide to Optimizing Pandas Code for Speed這篇文章,入門級的講了怎麼優化Pandas DataFrame的處理速度。app

數據準備

  1. 一個50000行的DataFrame,其head以下:ide

    d  m1        m2
    0               GbGXR/7198718882  66  0.670074
    1         ylaMAz/121108977765122  74  0.497126
    2         TmMGuz/841097771117122  39  0.360868
    3        RkzCzz/8210712267122122  76  0.293050
    4  sWxCNIji/11587120677873106105  14  0.893429
  2. 一個函數,接收一個參數:函數

    # 該函數必須能夠接收pd.Series或np.Array做爲參數,所以函數裏只有一些常規的運算操做 
    def simple_function(v):
        return (v**2 - v) // 2 + (v**0.5) // 2

開始測試

目的是將DataFramem1列中的值使用simple_function進行處理,生成一個新的m3列。oop

1. 最原始的方式,平均7.23s
%%timeit

m3 = []
df = origin_df.copy(deep=True)
for i in range(0, len(df)):
    m3.append(simple_function(df.iloc[i]['m1']))
df['m3'] = m3

1 loop, best of 3: 7.23 s per loop
2. 使用iterrows,平均3.27s
%%timeit

m3 = []
df = origin_df.copy(deep=True)
for _, row in df.iterrows():
    m3.append(simple_function(row['m1']))
df['m3'] = m3

1 loop, best of 3: 3.27 s per loop
3. 使用apply,平均29.5ms
%%timeit

df = origin_df.copy(deep=True)
df['m3'] = df['m1'].apply(simple_function)

10 loops, best of 3: 29.5 ms per loop
4. 使用Pandas series,平均7.88ms
%%timeit

df = origin_df.copy(deep=True)
df['m3'] = simple_function(df['m1'])

100 loops, best of 3: 7.88 ms per loop
5. 使用NumPy arrays,平均5.31ms
%%timeit

df = origin_df.copy(deep=True)
df['m3'] = simple_function(df['m1'].values)

100 loops, best of 3: 5.31 ms per loop
相關文章
相關標籤/搜索