簡體   English   中英

如何去除Pandas DF中的特殊字符?

[英]How to remove special characters from Pandas DF?

我有一個查詢數據庫的 Python BOT,將 output 保存到 Pandas Dataframe 並將數據寫入 Excel 模板。

昨天數據沒有保存到 Excel 模板中,因為記錄中的一個字段包含以下字符:

",  *,  /,  (, ), :,\n

Pandas 保存數據到文件失敗。

這是創建 dataframe 的代碼:

upload_df = sql_df.copy()

此代碼准備帶有時間/日期戳的模板文件

src = file_name.format(val="")
date_str = " " + str(datetime.today().strftime("%d%m%Y%H%M%S"))
dst_file = file_name.format(val=date_str)
copyfile(src, os.path.join(save_path, dst_file))
work_book = load_workbook(os.path.join(save_path, dst_file))

此代碼將 dataframe 保存到 excel 文件

writer = pd.ExcelWriter(os.path.join(save_path, dst_file), engine='openpyxl')
writer.book = work_book
writer.sheets = {ws.title: ws for ws in work_book.worksheets}
upload_df.to_excel(writer, sheet_name=sheet_name, startrow = 1, index=False, header = False)
writer.save()

我的問題是,在將 dataframe 寫入 Excel 模板之前,如何清除特定列[description]中的特殊字符?

我努力了:

upload_df['Name'] = upload_df['Name'].replace(to_replace= r'\W',value=' ',regex=True)

但這會刪除所有內容,而不是某種特殊字符。 我想我們可以使用一個項目列表並遍歷列表並運行替換,但是是否有更多 Pythonic 解決方案?

添加破壞excel文件的數據,防止pandas寫入信息:

這是造成問題的文本示例,我更改了一些普通字符以保護隱私,但與損壞文件的數據相同:

"""*** CRQ.: N/A *** DF2100109 SADSFO CADSFVO EN SERWO JL1047 EL PUWERTDTO EL DIA 08-09-2021 A LAS 11:00 HRS. PERA REALIZAR TRWEROS DE AWERWRTURA DE SITIO PARA MWERWO PWERRVO。

  • RWERE DE WERDDFF EN SITIO:ING。 JWER ERR3WRR ERRSDFF DFFF:RERFD DDDDF: 33 315678905。1) ADFDSF SDFDF Y DFDFF DE DFDF Y DFFF XXCVV Y CXCVDDÓN DE DFFFD EN DFDFFDD 2) EN SDFF DE REQUERIRSE: SDFFDF Y SDFDFF DE EEERRW HJGHJ (ACCESO, GHJHJ, RRRTHEEH) ACCESO A LA YUYUGGG
  1. 退休的JJGHJGHGH
  • 考慮 FGFFDGFG:SE FGGG LLAVE DE FF LLEVAR FFDDF PARA ERTBGFY Y SOLDAR。

您可以使用以下內容(將字符作為列表傳遞給方法參數):

upload_df['Name'] = upload_df['Name'].replace(
    to_replace=['"', '*', '/', '()', ':', '\n'],
    value=' '
)

由於一些要刪除的特殊字符是正則表達式元字符,我們必須先轉義這些字符,然后才能用正則表達式將它們替換為空字符串。

你可以通過re.escape自動處理 escaping 這些特殊字符,如下:

import re

# put the special characters in a list
special_char = ['"', '*', '/', '(', ')', ':', '\n']

special_char_escaped = list(map(re.escape, special_char))

轉義特殊字符的結果列表如下:

print(special_char_escaped)

['"', '\\*', '/', '\\(', '\\)', ':', '\\\n'] 

然后,我們可以使用.replace()刪除特殊字符,如下所示:

upload_df['Name'] = upload_df['Name'].replace(special_char_escaped, '', regex=True)

演示

數據設置

upload_df = pd.DataFrame({'Name': ['"abc*/(xyz):\npqr']})

                Name
0  "abc*/(xyz):\npqr

運行代碼:

import re

# put the special characters in a list
special_char = ['"', '*', '/', '(', ')', ':', '\n']

special_char_escaped = list(map(re.escape, special_char))

upload_df['Name'] = upload_df['Name'].replace(special_char_escaped, '', regex=True)

Output:

print(upload_df)


        Name
0  abcxyzpqr

編輯

使用您編輯的文本示例,這是刪除特殊字符后的結果:

print(upload_df)

                                                                                                                                                                                                                                                                          Name
0                                                                                                           CRQ. NA  DF2100109 SADSFO CADSFVO EN SERWO JL1047 EL PUWERTDTO EL DIA 08-09-2021 A LAS 1100 HRS. PERA REALIZAR TRWEROS DE AWERWRTURA DE SITIO PARA MWERWO PWERRVO.
1  RWERE DE WERDDFF EN SITIO  ING. JWER ERR3WRR ERRSDFF DFFF RERFD DDDDF  33 315678905. 1 ADFDSF SDFDF Y DFDFF DE DFDF Y DFFF XXCVV Y CXCVDDÓN DE DFFFD EN DFDFFDD 2 EN SDFF DE REQUERIRSE SDFFDF Y SDFDFF DE EEERRW HJGHJ ACCESO, GHJHJ, GHJHJ, RRRTTEE Y ACCESO A LA YUYUGGG
2                                                                                                                                                                                                                                                         3. RETIRAR JJGHJGHGH
3                                                                                                                       CONSIDERACIONES FGFFDGFG SE FGGG LLAVE DE FF LLEVAR FFDDF PARA ERTBGFY Y SOLDAR.S SE GDFGDFG LLAVE DE ERTFFFGG, FGGGFF EQUIPO PARA DFGFGFGFG Y SOLDAR.

您問題中列出的特殊字符已全部刪除。 請檢查現在是否正常。

使用str.replace

>>> df
                Name
0  (**Hello\nWorld:)


>>> df['Name'] = df['Name'].str.replace(r'''["*/():\\n]''', '', regex=True)
>>> df
         Name
0  HelloWorld

也許您想用空格替換換行符:

>>> df = df.replace({'Name': {r'["*/():]': '',
                              r'\\n': ' '}}, regex=True)
>>> df
          Name
0  Hello World

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM