【问题标题】:Unable to remove special characters ;:??/?<无法删除特殊字符 ;:??/?<
【发布时间】:2019-07-15 03:37:28
【问题描述】:

我正在加载带有逗号分隔值的 csv 文件。 Buit Tax_Amount 列有特殊字符,它正在替换值。 如何解决这个问题? 我试过下面的代码。但不工作。 Tax_Amount 值 = SN45000000001 40HX750_SEPT17 STOCK'';:??/?<.>

bad_chars = [";:??/?<."] 
#df['Tax_Amount'].replace(regex=True, inplace=True, to_replace=r'?', value=r'')
#df['Tax_Amount'] = df['Tax_Amount'].astype(str)
all_columns = list(df) # Creates list of all column headers
df[all_columns] = df[all_columns].astype(str)
#df['Tax_Amount'] = translate(None, ''.join(bad_chars)) 
test_string =df['Tax_Amount']
test_string = filter(lambda i: i not in bad_chars, test_string)

【问题讨论】:

  • ??/? 真的是字面意思,或者你的代码中的某些东西如何代表一些不可打印的 mojibake?为什么以及如何首先添加这些垃圾?有没有办法在上游的某个地方避免这种情况?
  • 您的一些被注释掉的尝试看起来几乎是正确的,但可以说是由于对文档的一些不那么神奇的阅读的结果。

标签: python python-3.x pandas


【解决方案1】:

您可以使用正则表达式从字符串中删除任何字符或模式。这里你需要删除的字符放在'[]'之间:

import re
str1 = "SN45000000001 40HX750_SEPT17 STOCK'';:??/?<."
str1 = re.sub('[;:/?<.\'"]', '', str1)
print(str1)

输出:

SN45000000001 40HX750_SEPT17 STOCK

【讨论】:

  • 这看起来你不知道[...] 实际做了什么。字符类匹配任何单个字符,该字符是类中枚举的字符之一。显然不需要多次指定任何字符。这将在任何地方替换这些字符,而不仅仅是在这种情况下(我猜这是 OP 想要的,可能不是你所相信的)。另外,为什么要在课堂上添加"(两次)?
  • @对不起,那个 " 写错了两次
  • 你还有三遍?
【解决方案2】:

Pandas str 允许您替换不需要的字符。这是一个如何仅使用 Pandas 解决它的示例

import pandas as pd

df = pd.DataFrame({'Tax_Amount': ['SN45000000001 40HX750_SEPT17 STOCK'';:??/?<.']})

pattern = '[:;\?\.<\'/]' # I use \ to ignore characters that are used in regex :)

df['Tax_Amount_Clean'] = df['Tax_Amount'].str.replace(pattern, '').str.strip()

print(df)

结果:

解释 pattern = '[:;\?\.&lt;\'/]' 我们告诉正则表达式查看[...] 中的所有值。但是我们知道.?是正则表达式中的保留字符,所以我们传递\.\?' which means treat this as they are and not as reserved key, we ignore also\'`,因为我们将它用作字符串。如果我们使用“”,那么我们可以保持原样。

【讨论】:

    【解决方案3】:
    bad_chars = [";",  ":", "?", "<" ,".", "'", '/'] 
    test_string = list(filter(lambda i: i not in bad_chars, Tax_Amount))
    print (''.join(test_string))
    
    SN45000000001 40HX750_SEPT17 STOCK
    

    (或)

    Tax_Amount = "SN45000000001 40HX750_SEPT17 STOCK'';:??/?<."
    bad_chars = [";",  ":", "?", "<" ,".", "'", '/'] 
    for k in str(Tax_Amount):
        if k in bad_chars:
            Tax_Amount=Tax_Amount.replace(k,'')
    
    print(Tax_Amount)
    
    SN45000000001 40HX750_SEPT17 STOCK
    

    【讨论】:

      【解决方案4】:

      您必须使bad_chars 成为一个单独字符的列表:

      bad_chars = [';',':','?','/','<','.'] 
      test_string = 'N45000000001 40HX750_SEPT17 STOCK'';:??/?<.'
      test_string = list(filter(lambda i: i not in bad_chars, test_string))
      print(test_string) 
      

      这样您的 lambda 函数将按您的预期工作。

      【讨论】:

        猜你喜欢
        • 2019-10-07
        • 2020-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多