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. ...
随机推荐
- stay:将代码翻译为Gif动图,妈妈再也不用担心我调试找不到bug了
本文首发于微信公众号:呼哧好大枫.原作者与本文作者是同一人. 平常在做算法题或者是 debug 的时候很需要一款能够实时地将代码执行逻辑和数据以图形化的形式渲染出来的工具.之前尝试了几款(visual ...
- java stream sorted排序 考虑null值
项目里使用到排序, java里没有像C# 里的linq,只有stream,查找stream.sorted源码看到有个 Comparator.nullsLast 然后看了一下实现,果然是能够处理null ...
- windows 配置java发布环境
一.jdk安装 1.下载jdk安装文件 2.在"系统变量"下"新建"选项"JAVA_HOME"值为:"jdk"文件夹路径 ...
- 记线上+线下培训思想i技巧感悟
刚刚结束一场线下+线上培训 梳理一下,有几个问题: 1.虽然课件自己过了几遍,同时备注里写了一些提示 ,但是真正讲课的时候基本是没有过程特意去扫备注 注意备注应清晰,写核心关键字 2.分屏过程 需要在 ...
- python 将字典转换为列表
在实现功能时,有时候有些函数适用于非字典形式 这时候就需要把字典转换为其他形式 本例主要讲解字典到列表转换 datas=[{'1':'nihao'},{'2':'very goog'}] to_lis ...
- docker批量删除容器或镜像
删除容器 停止所有容器 删除所有容器,需要先停止所有运行中的容器 docker stop `docker ps -a -q` docker ps -a -q,意思是列出所有容器(包括未运行的),只显示 ...
- Django实战项目-学习任务系统-自定义URL拦截器
接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了. 首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题. Django框 ...
- 编写你的第一个 Django 应用程序,第4部分
本教程从教程 3 停止的地方开始.我们是 继续民意调查应用程序,并将专注于表单处理和 减少我们的代码. 一.编写最小表单 让我们更新上一个教程的投票详细信息模板("polls/detail. ...
- docker常见问题修复方法
一.运行容器报错:Error response from daemon: Error running DeviceCreate (createSnapDevice) dm_task_run faile ...
- Delphi 检测鼠标键盘多久没有活动
function GetInputAwayTime():DWORD; var lpi:TLastInputInfo; begin lpi.cbSize := sizeof(lpi); GetLastI ...