提高pandas中嵌套应用程序的性能

2024-10-01 17:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧names和一个系列illegal_words

# names - ca. 250k rows
                    name
0   MISS ELFRIEDA ALPERT
1         DALE VON PETTY
2  MOHAMMAD IBN MASILLAH
3      YELENA THE MORRIS
4      MR. SHENNA DEMOSS
...

# illegal_words - ca. 2k rows
0  MISS
1  VON
2  THE
...

我想从名字中删除任何非法单词

我在循环中调用一个循环:

import re

for word in illegal_words:
    names['name'] = names['name'].apply(lambda x: re.sub(word, '', x))

输出:

# names
                 name
0     ELFRIEDA ALPERT
1         DALE  PETTY
2  MOHAMMAD  MASILLAH
3      YELENA  MORRIS
4       SHENNA DEMOSS
...

(双空格不是什么大问题)

这是可行的,但是这非常慢re.sub()方法被调用了2'000*250'000=500'000'000次

我能做些什么来加速它

(因为illegal_words是非常特定于项目的,所以我不能使用任何外部包)


Tags: namerenamescarowswordsvonmiss
1条回答
网友
1楼 · 发布于 2024-10-01 17:30:12

你能试试吗

illegal_words = ['MISS', 'VON', 'THE']

out = df['name'].str.replace(fr"({'|'.join(illegal_words)}) ", '', regex=True)
>>> out
0          ELFRIEDA ALPERT
1               DALE PETTY
2    MOHAMMAD IBN MASILLAH
3            YELENA MORRIS
4        MR. SHENNA DEMOSS
Name: name, dtype: object

性能

对于2500个单词和250000条记录的随机列表:

%timeit df['name'].str.replace(fr"({'|'.join(illegal_words)}) ", '', regex=True)
130 ms ± 870 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

相关问题 更多 >

    热门问题