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

效率:

这里写图片描述

优化后思路:

    ...
    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)]
  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值