一、使用numpy加速dataFrame索引,从dataFrame中抽取需要的数据:
当dataFrame太大时,pandas索引(如 df[df['age'] == 30)的速度较慢。可以用向量化方法进行加速。
一个例子如下,其作用是从data_df中抽取需要的imei的数据:
imei_list = list(set(data_df['imei']))
tt = data_df.values
#分别得到data_df第1~4列的数据
imei_col_data = tt[:,0]
lng_col_data = tt[:,1]
lat_col_data = tt[:,2]
tmstp_col_data = tt[:,3]
#指定一个imei,并找到和它相关的时间戳和经纬度
sel_imei = imei_list[i]
index = np.where(imei_col_data == sel_imei)
lng_list = lng_col_data[index]
lat_list = lat_col_data[index]
tmstp_list = tmstp_col_data[index]
其中data_df的四列分别为imei,经度,纬度,时间戳。这个例子的作用相当于
sel_data = data_df[data_df['imei'] == sel_imei]
lng_list = list(sel_data['lng'])
lat_list = list(sel_data['lat'])
tmstp_list = list(sel_data['tmstp'])
至此已经提取出了相关的数据,这时进行相关的处理即可。
二、使用apply_along_axis替代apply,加速数值型apply的计算
import time
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(8000000).reshape(2000000,4),columns=list('abcd'))
t1=time.time()
s1=df.apply(lambda x:x['a']+x['d'],axis=1)
t2=time.time()
print(t2-t1)
arr=df.values
t3=time.time()
s=np.apply_along_axis(lambda x:x[0]+x[3],axis=1,arr=arr)
t4=time.time()
print(t4-t3)
# output:
#18.062725067138672
#3.8327248096466064
可见,使用这种方法,计算时间从18s减少到3.83s,大大提升了执行速度。