Pandas 清除 Excel 特殊字符
清除 Excel 特殊字符
主要是为了做一个笔记, 用 遍历 DataFrame 用正则匹配特殊字符并替换.
是上个月初的项目了, 其中有个将 Excel 传入数据库的时候, 发现有特殊字符, 很奇怪的那种特殊字符, 什么小五角星, 小书书, 小太阳, 耳机 等这种字符, 真的好奇怪. 后来发现, 这种问题竟然是经常出现, 于是来做个笔记, 方便自己以后再遇到的时候, 能轻松复制粘贴.
需求
清除 Excel 的特殊字符, 诸如 小星星, 小花花, 小太阳, 小提琴, 小耳机 ... 等这些小可爱.
输入是一个 Excel 表格, 输出去 清除 (替换) 掉特殊字符的 Excel 表格 ( 跟输入一样) .
方案
特殊字符匹配用 正则表达式在查询并替换 re.compile(); re.sub();
用 Pandas 读取 Excel 数据为 DataFrame
遍历 DataFrame 的每个格子, 进行正则匹配 并替换 df.loc 和 iloc
查找特殊字符并替换
找了好久的规律, 仔细琢磨发现的, 那些特殊字符是可用 unicode 进行匹配出来.
[\U0001000 - \U001ffff]
然后呢, 我们的操作就是, 查找, 并并进行替换, 封装为一个函数哦.
def replace_spec_char(char, replace_char):
"""替换掉特殊字符, 用某种自定义标记"""
if not isinstance(char, str):
return "输入的是非字符串哦"
pattern = re.compile(u'[\U0001000 - \U001ffff]')
# 替换
return pattern.sub( replace_char, char)
遍历 DataFrame 并清理
用下标索引 iloc 的方式来弄即可. 其实关于 df.loc 和 df.iloc 我从来就没有真正记住和区分过, 大约只是记得 loc 用于有名字的 所有, 如字段啥的. iloc 是按照下标索引.
而我想表达的学习方法是, 根本不用去刻意记, 有印象和临时百度就好啦. 就好比, 我始终不能区分 json.loads() 和 json.dumps() ; 或者 eval() 和 __ repr __ () ; 或者 pandas / numpy 中 的 轴 axis = 1 或 0 ... 这类到底是啥的问题,
解决之道 是 留大概印象, 即用即查.
def parse_data(file_path, replace_char):
"""替换 Excel 特殊字符"""
try:
df = pd.read_excel(file_path):
except:
raise "数据读取异常"
# 遍历每个单元格, 先行后列我比较习惯而已
row, col = df.shape
for i in range(row):
for j in range(col):
# 当前格元素, 发现上面写不对, 字符校验应该在这里
cur_value = df.iloc[i, j]
pure_char = replace_char(cur_value, replace_char)
# 把特殊字符, 及其所在的行列坐标给打印出来
if cur_value != pure_chare:
print(f"特殊字符: {cur_value} 位于 {i+1}行, {j+1}列.")
# 并同时将当前值用 清理好的字符替换
df.iloc[i, j] = pure_char
print("清理完毕!")
遍历DF 的 cell
还是稍微演示一把好一点.
df = pd.DataFrame({
'name':['youyou', 'youge', 'jieer'],
'age': [18, 22, nan],
'gender': ['F', nan, 'M']
})
df
name age gender
0 youyou 18.0 F
1 youge 22.0 NaN
2 jieer NaN M
# 我个人喜欢按 row 来进行遍历哦
row, col = shape
for i in range(row):
for j in range(col):
print(df.iloc[i, j]ue,'\t\t', type(df.iloc[i, j]))
youyou <class 'str'>
18.0 <class 'numpy.float64'>
F <class 'str'>
youge <class 'str'>
22.0 <class 'numpy.float64'>
nan <class 'float'>
jieer <class 'str'>
nan <class 'numpy.float64'>
M <class 'str'>
for i in range(df.shape[0]):
for j in range(df.shape[1]):
cur_value = df.iloc[i, j]
if isinstance(cur_value, str):
df.iloc[i, j] = "是字符"
# df.iloc[i, j] = 'xxx' 是原地的哦
print(df)
name age gender
0 是字符 18.0 是字符
1 是字符 22.0 NaN
2 是字符 NaN 是字符
完整实现
上面的代码呢, 后面的函数, 嵌套了前面的函数. 我之前觉得没啥, 后来跟小伙伴, 他做 Java 的, 然后聊了一波 面向对象, 同时也是, 之前接了一波同事的 数据处理代码, Python 的面向对象写法. 我发现, Python 的面向对象写法, 其实不太好. 一不小心就, 容易, 代码给 混在一起, 互相调用, 容易搞成 高耦合., 别人很难去维护.
至少是脚本这块哈, 我希望自己是:
可能更倾向于, 函数式编程的模式;
或者说, 一个函数一个功能, 尽可能解耦, 最后用 main 来调用.
从本例, 就尽量,不要出现, 第二个 一个函数中, 调用 另一个函数 的风格. 这种可以写在 main 中, 就这样吧. 重在理解过程和让代码可读性更强一些.
def replace_spec_char(char, replace_char):
"""替换掉特殊字符, 用某种自定义标记"""
# 匹配并进行替换
pattern = re.compile(u'[\U0001000 - \U001ffff]')
return pattern.sub( replace_char, char)
def get_data(file_path):
"""将 Excel 数据读入为 DataFrame"""
try:
df = pd.read_excel(file_path)
except:
raise "数据读取异常!"
return df
def main():
data = get_data(file_path)
# 获取data 的行, 列数, 并进行遍历
row, col = data.shape
# 遍历每个 cell, 并对字符串的 cell 进行清洗
for i in range(row):
for j in range(col):
# cell 值
cur_value = data.iloc[i, j]
# 只对字符如进行清洗
if isinstance(cur_value, str):
pure_char = replace_spec_char(char, replace_char)
# 跟清洗前做比对, 打印出特殊符行列号
if cur_value != pure_char:
print(f"特殊字符: {cur_value} 位于 {i+1}行, {j+1}列.")
# 同时将当前个用清理好的进行原地替换
data.iloc[i, j] = pure_char
print("清理完毕")
因为我经常会用到, 因此还打了个包, exe 的, 哎呀不写了, 打包用 pyinstaller 又不难的, 不展开了.
小结
- 匹配特殊字符, 结合强大的正则表达式, 如 re.compile(), re.sub(), re.match(), re.findall ( ) 都很常用
- 遍历 DataFrame 用索引方式 df.iloc 速度还行. 遍历这块, 同样 df.iterrows() 也是我常用的呢
- 原地替换 data.iloc[i, j] = 666 简单又暴力, 现脚本这块更倾向函数式编程, 尤其是解耦和可读性, 我觉得更重要
Pandas 清除 Excel 特殊字符的更多相关文章
- 深入理解pandas读取excel,txt,csv文件等命令
pandas读取文件官方提供的文档 在使用pandas读取文件之前,必备的内容,必然属于官方文档,官方文档查阅地址 http://pandas.pydata.org/pandas-docs/versi ...
- Python利用pandas处理Excel数据的应用
Python利用pandas处理Excel数据的应用 最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...
- 51-python3 pandas读写excel
转载自:https://blog.csdn.net/brink_compiling/article/details/76890198?locationNum=7&fps=1 0. 前言Pyth ...
- pandas 将excel一列拆分成多列重新保存
利用pd.read_excel 做到将第二列“EVT-LBL”按“-”分割后重新加三列在df后面 1 读取表格df 2. 分割第二列短横连接的数字,保存到df2---- 参考:str.spilt( ...
- 【python基础】利用pandas处理Excel数据
参考:https://www.cnblogs.com/liulinghua90/p/9935642.html 一.安装第三方库xlrd和pandas 1:pandas依赖处理Excel的xlrd模块, ...
- Python 使用Pandas读取Excel的学习笔记
这里介绍Python中使用Pandas读取Excel的方法 一.软件环境: OS:Win7 64位 Python 3.7 二.文件准备 1.项目结构: 2.在当前实验文件夹下建立一个Source文件夹 ...
- 机器学习之数据预处理,Pandas读取excel数据
Python读写excel的工具库很多,比如最耳熟能详的xlrd.xlwt,xlutils,openpyxl等.其中xlrd和xlwt库通常配合使用,一个用于读,一个用于写excel.xlutils结 ...
- pandas read excel文件碰到的一个小问题
今天利用pandas读取excel时,爆出如下错误: 代码为: import pandas as pd db_eua=pd.read_excel('db_eua.xlsx',sheetname='EU ...
- Python用Pandas读写Excel
Pandas是python的一个数据分析包,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.Pandas提供了大量能使我们快速便捷地处理数据的函数和方法. Pandas官方文档 ...
- 利用pandas读取Excel表格,用matplotlib.pyplot绘制直方图、折线图、饼图
利用pandas读取Excel表格,用matplotlib.pyplot绘制直方图.折线图.饼图 数据: 折线图代码: import pandas as pdimport matplotlib. ...
随机推荐
- 中国最难入职的IT公司排行榜
在IT行业竞争日益白热化的今天,头部企业的招聘门槛不断刷新求职者的认知.根据最新行业调研和招聘数据,我们整理出2025年中国最难入职的几家互联网公司,并揭秘其背后严苛的选拔逻辑. 通常衡量难不难,会从 ...
- 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
大家好,我是编程乐趣. DeepSeek大火,网络上也看到很多人分享本地部署心得.但想要更细了解,还是要自己本地部署一次. 我这次部署目标,就是在局域网服务器部署,并让局域网其他电脑可以直接访问. 选 ...
- Openlayers 距离环绘制
思路:利用layer的StyleFunction 来使地图移动或者放缩的时候,使圆保持在地图中心 /** * 绘制距离环 * @param {number} distance 每环间隔距离,单位:米 ...
- Zookeeper - 客户端常用命令
查看客户端命令帮助信息 查看Zookeeper的版本 查看使用过的历史命令 查看根目录下的znode 创建znode 查看节点信息 修改znode的内容 删除znode 关闭连接 连接客户端 退出客户 ...
- PHP中类和对象相关的函数
1.class_exists 用于判断一个类是否存在,参数为类名: 2.interface_exists 判断一个接口是否存在,参数为接口名: 3.method_exists 判断一个方法是否存在,参 ...
- sap 管理--企业解决方案 -设备管理
1.什么是sap 管理 2.设备管理管的是什么 3.设备的几种状态 4.设备bom(物料清单) 5.测量点计数器 1.什么是sap 管理 System Applications and Product ...
- 基于近红外与可见光双目摄像头的人脸识别与活体检测,文末附Demo
基于近红外与可见光双目摄像头的活体人脸检测原理 人脸活体检测(Face Anti-Spoofing)是人脸识别系统中的重要一环,它负责验证捕捉到的人脸是否为真实活体,以抵御各种伪造攻击,如彩色纸张打印 ...
- go 地址对齐保证
unsafe标准库包 func Alignof(variable ArbitraryType) uintptr. 此函数用来取得一个值在内存中的地址对齐保证(address alignment gua ...
- Java工程师应该掌握的知识
https://pan.baidu.com/s/1pXKwwVwE_g9RhjGrbABcUAydvn 以Java工程师应该掌握的知识,按重要程度排出六个梯度: 第一梯度:计算机组成原理.数据结构和算 ...
- Linux下启动Oracle命令
1.进入LInux,切换到Oracle用户权限,输入数据库密码.su - oracle 1在这里插入图片描述2.输入sqlplus "/as sysdba" 1在这里插 ...