如何从 Pandas DF 中删除特殊字符?
How to remove special characters from Pandas DF?
我有一个查询数据库的 Python BOT,将输出保存到 Pandas Dataframe 并将数据写入 Excel 模板。
昨天数据没有保存到Excel模板,因为记录中的一个字段包含以下字符:
", *, /, (, ), :,\n
Pandas未能将数据保存到文件。
这是创建数据框的代码:
upload_df = sql_df.copy()
此代码准备带有 time/date 戳
的模板文件
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))
此代码将数据帧保存到 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()
我的问题是,在将数据框写入 Excel 模板之前,如何清除数据框中特定列 [description]
中的特殊字符?
我试过:
upload_df['Name'] = upload_df['Name'].replace(to_replace= r'\W',value=' ',regex=True)
但这会删除所有内容,但不会删除特定类型的特殊字符。
我想我们可以使用项目列表并遍历列表和 运行 replace 但是是否有更多 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, GHJHJ, RRRTTEE Y ACCESO A LA YUYUGGG
- RETIRAR JJGHJGHGH
- 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."""
您可以使用以下方法(将字符作为列表传递给方法参数):
upload_df['Name'] = upload_df['Name'].replace(
to_replace=['"', '*', '/', '()', ':', '\n'],
value=' '
)
使用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
由于一些要删除的特殊字符是正则表达式元字符,我们必须先转义这些字符,然后才能替换它们用正则表达式清空字符串。
可以通过re.escape
自动转义这些特殊字符,如下:
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)
输出:
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.
您问题中列出的特殊字符已全部删除。请检查现在是否正常
我有一个查询数据库的 Python BOT,将输出保存到 Pandas Dataframe 并将数据写入 Excel 模板。
昨天数据没有保存到Excel模板,因为记录中的一个字段包含以下字符:
", *, /, (, ), :,\n
Pandas未能将数据保存到文件。
这是创建数据框的代码:
upload_df = sql_df.copy()
此代码准备带有 time/date 戳
的模板文件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))
此代码将数据帧保存到 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()
我的问题是,在将数据框写入 Excel 模板之前,如何清除数据框中特定列 [description]
中的特殊字符?
我试过:
upload_df['Name'] = upload_df['Name'].replace(to_replace= r'\W',value=' ',regex=True)
但这会删除所有内容,但不会删除特定类型的特殊字符。 我想我们可以使用项目列表并遍历列表和 运行 replace 但是是否有更多 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, GHJHJ, RRRTTEE Y ACCESO A LA YUYUGGG
- RETIRAR JJGHJGHGH
- 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."""
您可以使用以下方法(将字符作为列表传递给方法参数):
upload_df['Name'] = upload_df['Name'].replace(
to_replace=['"', '*', '/', '()', ':', '\n'],
value=' '
)
使用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
由于一些要删除的特殊字符是正则表达式元字符,我们必须先转义这些字符,然后才能替换它们用正则表达式清空字符串。
可以通过re.escape
自动转义这些特殊字符,如下:
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)
输出:
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.
您问题中列出的特殊字符已全部删除。请检查现在是否正常