多个csv文件匹配筛选优化小技巧,提速50倍
任务描述:处理users(百万级),shops(万级)这2个csv文件,根据shops里的userid找到相应user,计算匹配的shop和user经纬度差值,即(shop.lon-user.lon,shop.lat-user.lat)。考虑将其转化为dataframe,方便处理,即得到df_shops,df_users。
优化前思路:
...
for index in df_shops.index:
lon1=df_shops.iloc[index,2]
lat1=df_shops.iloc[index,3]
for index2 in df_users.index:
if(df_shops.iloc[index,0]==df_users.iloc[index2,1]):
lon2=df_users.iloc[index2,3]
lat2=df_users.iloc[index2,4]
dis_lon=lon1-lon2
dis_lat=lat1-lat2
...
效率:
优化后思路:
...
for index in df_shops.index:
lon1=df_shops.iloc[index,2]
lat1=df_shops.iloc[index,3]
new_df=df_users[df_users['shop_id']==df_shops.iloc[index,0]]
for index2 in new_df.index:
lon2=df_users.iloc[index2,3]
lat2=df_users.iloc[index2,4]
dis_lon=lon1-lon2
dis_lat=lat1-lat2
...
效率:
可以看到,优化后速度提升为原来的近50倍!
值得思考的问题
为什么DataFrame条件筛选如此之快,完胜for循环的if比较?查阅相关资料,貌似是因为DataFrame条件筛选是通过布尔索引完成的,其效率非常高。
启示:for+if 遍历比较字符串是否匹配效率低,开销大,在数据处理中尽量避免使用。
疑问:筛选这么快,具体是怎么实现的?以后有机会我再补充修改此文。
补充一些DataFrame条件筛选知识:
- 导入库 :
import pandas as pd
- 创建DataFrame数据:
dataframe=pd.DataFrame(columns=['a','b','c'])
- 假如想筛选出a列大于0的行:
dataframe.a>0
- 想多条件筛选:
daraframe[(dataframe.a>0)&(dataframe.b<10)]
- 只需要返回筛选出的数据的a,b两列:
dataframe[['a','b']]\[(dataframe.a>0)&(dataframe.b<10)]