优化Pandas DataFrame的处理速度
背景
本文的内容主要来源于A Beginner’s Guide to Optimizing Pandas Code for Speed这篇文章,入门级的讲了怎么优化Pandas DataFrame
的处理速度。
数据准备
一个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
一个函数,接收一个参数:
# 该函数必须可以接收pd.Series或np.Array作为参数,因此函数里只有一些常规的运算操作 def simple_function(v): return (v**2 - v) // 2 + (v**0.5) // 2
开始测试
目的是将DataFrame
的m1
列中的值使用simple_function
进行处理,生成一个新的m3
列。
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
相关推荐
roamer 2020-10-29
三石 2020-08-23
QianYanDai 2020-08-16
mmmjyjy 2020-07-16
QianYanDai 2020-07-05
QianYanDai 2020-07-05
jiahaohappy 2020-06-21
QianYanDai 2020-06-16
zhangxiaojiakele 2020-05-25
jzlixiao 2020-05-15
jiahaohappy 2020-05-12
zhangxiaojiakele 2020-05-11
jzlixiao 2020-05-08
Series是一种类似于一维数组的对象,由一组数据以及一组与之对应的索引组成。 index: 索引序列,必须是唯一的,且与数据的长度相同. 如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引
jzlixiao 2020-05-09
三石 2020-10-30
三石 2020-10-29
wangquannuaa 2020-10-15
wangquannuaa 2020-09-29
jzlixiao 2020-09-15