乐趣区

优化Pandas-DataFrame的处理速度

背景

本文的内容主要来源于 A Beginner’s Guide to Optimizing Pandas Code for Speed 这篇文章,入门级的讲了怎么优化 Pandas DataFrame 的处理速度。

数据准备

  1. 一个 50000 行的 DataFrame,其head 如下:

                                   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. 一个函数,接收一个参数:

    # 将形如 'GbGXR/7198718882' 这样的字符串 '/' 后面的数字切分出来
    def split_id(value):
        value = str(value)
        if '/' in value:
            return value.rsplit('/', 1)[1]
        return value

开始测试

目的是将 DataFramed列中的值 ’/‘ 后面的数字切割出来,生成一个新的 id 列。

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

_ids = []
df = origin_df.copy(deep=True)
for i in range(0, len(df)):
    _ids.append(split_id(df.iloc[i]['d']))
df['id'] = _ids

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

_ids = []
df = origin_df.copy(deep=True)
for _, row in df.iterrows():
    _ids.append(split_id(row['d']))
df['id'] = _ids

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

df = origin_df.copy(deep=True)
df['id'] = df['d'].apply(split_id)

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

df = origin_df.copy(deep=True)
df['id'] = split_id(df['d'])

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

df = origin_df.copy(deep=True)
df['id'] = split_id(df['d'].values)

100 loops, best of 3: 5.31 ms per loop
退出移动版