Python DataFrame按条件筛选相同元素或字符串

这几天在处理数据,其中有遇到需要统计相同用户的某些数据,一开始采用直接暴力匹配,时间复杂度虽然为O(n^2),但因为数据量太多,判断条件花销较大,因而处理的非常慢。而后又将数据先排序,并设置条件判断,但这样越到后面处理速度会越慢,因为是从头开始遍历,当遇到没有的元素时,就会遍历一遍全部数据,这样的花销太大了。
如下所示,因为排了序,所以相关的数据一定是在某个区间,因此当匹配到这个区间后,再遇到其他非区间内的值就可以直接跳出,但这种只对前面的数据处理有些许提升。

    for j in temp.index:
        f = data.loc[i,'user'] == temp.loc[j,'user']
        if f:
            t+=1
            count+= temp.loc[j,'amount']
            flag = 1
        if flag == 1 and bool(1-f):
            break
    x1.append(t)
    x2.append(count)
    print(data.loc[i,'user']," ",t," ",count)

然后在网上找相关处理方式,基本上都是采用暴力匹配方式。
反思了一下,想到以前打比赛的时候有个队员有用到列表推导式,直接将程序从40s降到0.5s,可见列表推导式的强大。反观之前的处理方式,虽然简单,但过于朴素,遇到数据大一点就没辙了。

列表推导式

列表推导式被编译后的字节码执行速度更快。python当然不是一门编译型语言,但是它还是要被解析成二进制的字节码才能被执行,执行它的正是python解释器。

下面给出我的方法,先直接通过列表推导式得到满足条件的数据,然后直接遍历该数据就可以了,其中可以看到,在原先的方法中,绝大部分时间都在匹配是否相同上,即需要每次都拿出一个来匹配。

x1=[]
x2=[]
for i in data.index:
    count = 0
    a = temp[(temp['user']==data.loc[i,'user'])]
    t = len(a)
    for j in a.index:
        count+= a.loc[j,'amount']
    x1.append(t)
    x2.append(count)
    print(data.loc[i,'user']," ",t," ",count)

猜你喜欢

转载自blog.csdn.net/Geek_/article/details/107740938
今日推荐