python - 由于组太多,Pandas 过滤器执行缓慢

标签 python pandas

我有一个很大的 df 需要更改。对于一项计算,我想将数据分组到 pborderid 上,然后只保留 to_wpadr 中具有重复值的行。

这是我的 df 的示例。

     pborderid   pbcarid wsid  to_wpadr  colli pk_end_time            
10   76079450  61838497  hp1  523-369p      1 2016-07-01 00:00:38     
11   76079450  61838504  hp1  523-370p      1 2016-07-01 00:00:47     
12   76079450  61838110  hp1  523-372p      1 2016-07-01 00:01:05     
13   76079450  61838225  hp1  523-372p      2 2016-07-01 00:01:13      
14   76079450  61838504  hp1  523-372p      3 2016-07-01 00:01:30     
15   76079450  61838497  hp1  523-373p      1 2016-07-01 00:01:45      
16   76079450  61838504  hp1  523-377p      1 2016-07-01 00:01:55      
17   76079450  61838110  hp1  523-376p      5 2016-07-01 00:02:26      
18   76079450  61838225  hp1  523-376p      1 2016-07-01 00:02:33     
19   76079450  61838497  hp1  523-376p      6 2016-07-01 00:02:55  

使用以下代码是可行的,但是当组数增加时,性能会显着下降,最多需要 20 秒。我认为仅使用 pborderid 作为组然后过滤/应用应该是可行的。

ap=ot.groupby(["pborderid","to_wpadr"],sort=False).filter(lambda x: len(x) >1)  

有人对我如何只能使用一个组列或如何提高性能有任何建议吗?

这是想要的结果:

    pborderid   pbcarid wsid  to_wpadr  colli         pk_end_time 
12   76079450  61838110  hp1  523-372p      1 2016-07-01 00:01:05      
13   76079450  61838225  hp1  523-372p      2 2016-07-01 00:01:13        
14   76079450  61838504  hp1  523-372p      3 2016-07-01 00:01:30       
17   76079450  61838110  hp1  523-376p      5 2016-07-01 00:02:26        
18   76079450  61838225  hp1  523-376p      1 2016-07-01 00:02:33        
19   76079450  61838497  hp1  523-376p      6 2016-07-01 00:02:55        

最佳答案

我不知道是否会更快,但你可以尝试使用 DataFrame.duplicated仅过滤重复项。

ap = ot[ot.duplicated(subset=['pborderid', 'to_wpadr'], keep=False)]

针对 1M 行 DF 的计时:

In [244]: df = pd.concat([df] * 10**5, ignore_index=True)

In [245]: %timeit df.groupby(["pborderid","to_wpadr"],sort=False).filter(lambda x: len(x) >1)
1 loop, best of 3: 313 ms per loop

In [246]: %timeit df[df.duplicated(subset=['pborderid', 'to_wpadr'], keep=False)]
10 loops, best of 3: 129 ms per loop

In [247]: df.shape
Out[247]: (1000000, 6)

关于python - 由于组太多,Pandas 过滤器执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250077/

相关文章:

python - 在枚举类中声明一个静态变量

python - 是什么导致 "elasticsearch.exceptions.ConnectionError: ConnectionError ... error(' getaddrinfo() argument 2 must be integer or string',)))

Python:如何将unicode与变量内的unicode进行比较

python - 打印一个 Jupyter 单元格中定义的所有变量

python - Pandas 'bool object is not callable'

python - 如何在 Python 中获取组合 Unicode 字符串的 "visible"长度?

python - 在 scikits learn 中使用 cross_val_score 时保留拟合参数

python - 如何导入csv并访问表数据?

pandas - 生成具有条件的随机数列表 - numpy

Python Pandas : differentiating all time series in data frame by group without the date variable