代码之家  ›  专栏  ›  技术社区  ›  nmog

筛选出包含非字母数字字符的行

  •  3
  • nmog  · 技术社区  · 8 年前

    我试图从一个现有的数据帧中获取一个数据帧,该数据帧只包含某些列(其值是字符串)中的值不包含特定字符的行。

    也就是说,如果我们不想要的角色是 '('

    原始数据帧:

       some_col my_column
    0         1      some
    1         2      word
    2         3    hello(
    

    新数据帧:

       some_col my_column
    0         1      some
    1         2      word
    

    我试过了 df.loc['(' not in df['my_column']] ,但这不起作用,因为 df['my_column'] 是序列对象。

    我也尝试过: df.loc[not df.my_column.str.contains('(')] ,这也不起作用。

    2 回复  |  直到 8 年前
        1
  •  3
  •   cs95 abhishek58g    8 年前

    你在找 str.isalpha :

    df[df.my_column.str.isalpha()]
    
       some_col my_column
    0         1      some
    1         2      word
    

    str.isalnum ,如果要保留字母和数字。

    如果要处理字母和空白字符,请使用

    df[~df.my_column.str.contains(r'[^\w\s]')]
    
       some_col my_column
    0         1      some
    1         2      word
    

    最后,如果您希望删除整个标点符号,我在这里编写了一个问答,这可能是一个有用的读物: Fast punctuation removal with pandas

        2
  •  2
  •   piRSquared    8 年前

    如果你想过滤掉这个角色:

    否定 str.contains

    逃离空旷的海滩。有些字符可以解释为特殊的regex字符。你可以用一个反斜杠来避开它们。

    df[~df.my_column.str.contains('\(')]
    
       some_col my_column
    0         1      some
    1         2      word
    

    str.match 所有非开放paren

    顺便说一下,这是个坏主意!检查整个字符串是否不是带有regex的字符是很恶心的。

    df[df.my_column.str.match('^[^\(]*$')]
    
       some_col my_column
    0         1      some
    1         2      word
    

    理解使用 in

    df[['(' not in x for x in df.my_column]]
    
       some_col my_column
    0         1      some
    1         2      word