过滤包含特殊字符的pandas数据框行的最快方法

4

我有一个特殊字符列表。例如

BAD_CHARS = ['.', '&', '\(', '\)', ';', '-']

我希望能够从pandas数据框的列中删除所有包含这些特殊字符的行。目前我正在执行以下操作:
df = '''
        words  frequency
            &         11
    CONDUCTED          3
       (E.G.,          5
   EXPERIMENT          6
         (VS.          5
        (WARD          3
            -         14
        2006;          3
           3D          5
         ABLE          5
     ABSTRACT          3
  ACCOMPANIED          5
     ACTIVITY         11
           AD          5
       ADULTS          6
'''
for char in BAD_CHARS:
    df = df[~df['word'].str.contains(char)]

# Expected Result
        words  frequency
    CONDUCTED          3
   EXPERIMENT          6
           3D          5
         ABLE          5
     ABSTRACT          3
  ACCOMPANIED          5
     ACTIVITY         11
           AD          5
       ADULTS          6

首先它不工作,其次速度不够快。那么我该如何以更快的方式实现呢?谢谢。


请给 @Zero 打个标记。 - cs95
1
首先,不要转义大括号。BAD_CHARS = ['.', '&', '(', ')', ';', '-']。接下来,您可以使用字符类或使用 re.escape。像这样:df[~df['words'].str.contains("[{}]".format(''.join(BAD_CHARS)))] - cs95
如果你复制有问题,就直接打出来。 - cs95
1个回答

5

我认为你首先需要转义值,然后使用|进行连接,如@cᴏʟᴅsᴘᴇᴇᴅ所指出的那样,从BAD_CHARS的值中删除\

import re

BAD_CHARS = ['.', '&', '(', ')', ';', '-']
pat = '|'.join(['({})'.format(re.escape(c)) for c in BAD_CHARS])

df = df[~df['words'].str.contains(pat)]
print (df)
          words  frequency
1     CONDUCTED          3
3    EXPERIMENT          6
8            3D          5
9          ABLE          5
10     ABSTRACT          3
11  ACCOMPANIED          5
12     ACTIVITY         11
13           AD          5
14       ADULTS          6

由于返回了空帧,因此出现此问题:
df[~df['word'].str.contains('|'.join(BAD_CHARS))]

它返回空帧 :( - muazfaiz
这个问题被关闭为重复,并且我在评论中解决了他们问题的具体细节。否则,我本可以自己发布答案 :/ - cs95
谢谢。这太容易了 :) - muazfaiz
@cᴏʟᴅsᴘᴇᴇᴅ - 我不明白 否则,我本可以自己发布答案 :/ 你认为我抄袭了你的评论回答吗?我只使用了评论的一部分 - 没有逃避它,并添加了提到的内容。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接