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. ...
随机推荐
- Zookeeper - 客户端常用命令
查看客户端命令帮助信息 查看Zookeeper的版本 查看使用过的历史命令 查看根目录下的znode 创建znode 查看节点信息 修改znode的内容 删除znode 关闭连接 连接客户端 退出客户 ...
- /proc的相关知识
/proc的相关知识 /proc 介绍 /proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可 ...
- 2024.11.12随笔&联考总结
前言 心情不好,因为考试时 T2T3 全看错题了,导致 T2 没做出来,T3 一份没得.然后下午打球眼镜架子坏了,回机房才发现被高二的盒了. 但还是稍微写一下总结吧. 总结 感觉我今天做题状态还行,思 ...
- 大模型知识引擎 LKE 新手入门指南:官方文档难懂?看这篇就够了
昨天简单体验了一下大模型知识引擎(LKE),总体来说,虽然其功能方面还有一定欠缺,但在一些特定领域,特别是RAG(Retrieval-Augmented Generation)技术的应用上,还是表现出 ...
- Dify 和 Manus 的技术架构差异
Dify 框架能够部分实现 Manus 的功能效果,但在复杂任务自动化.多代理协作等领域存在技术差距. 一.核心功能对比 1. 任务拆解与执行能力 Dify:支持通过 Agent 模式 进行任务分解, ...
- Vulnhub-FristiLeaks_1.3
一.靶机搭建 选择扫描虚拟机 选择路径即可 二.信息收集 靶机信息 产品名称:Fristileaks 1.3 作者:Ar0xA 发布日期: 2015 年 12 月 14 日 目标:获取root(uid ...
- Vulnhub-Hackme
一.靶机搭建 选择扫描虚拟机 选择路径即可 二.信息收集 靶机信息 Name: hackme: 1 Date release: 18 Jul 2019 难度:初级,目标是通过web漏洞获得有限的权限访 ...
- [python]pip换源详解
[python]pip换源详解 前言 现有的各个网站上的pip换源方式,很零散,或者是很单调的重复,又或者只是给出命令,尽管这通常就够用了. 但是,我希望汇总一下,然后再结合pip的官方文档来做一 ...
- 用状态模式开发一个基于WPF的截图功能
状态模式 状态模式是设计模式中的一种行为设计模式,对很多人来说,这个模式平时可能用不到.但是如果你做游戏开发的话,我相信你应该对这个模式有一个很深刻的理解.状态模式在游戏中开发中还是比较常见的.状态模 ...
- python初学习一
#1.切片操作 左闭右开 s='Hello word' print(s[0:5]) #2.更新字符串 s1='hello word' s2='python' print(s1[0:6]+s2) #3. ...