我有一个很大的 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/