DataFrame条件筛选完胜for+if,提速50倍

多个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
                ...

效率:

DataFrame条件筛选完胜for+if,提速50倍_第1张图片

优化后思路:

    ...
    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
            ...

效率:

DataFrame条件筛选完胜for+if,提速50倍_第2张图片

可以看到,优化后速度提升为原来的近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)]

你可能感兴趣的:(python数据分析处理)