python删除标点_python – 使用pandas快速删除标点符号
建立
出于演示的目的,让我们考虑一下这个DataFrame.
df = pd.DataFrame({'text':['a..b?!??', '%hgh&12','abc123!!!', '$$$1234']})
df
text
0 a..b?!??
1 %hgh&12
2 abc123!!!
3 $$$1234
下面,我逐一列出替代方案,以提高性能
str.replace
包含此选项可将默认方法建立为比较其他更高性能解决方案的基准.
这使用pandas内置的str.replace函数,它执行基于正则表达式的替换.
df['text'] = df['text'].str.replace(r'[^\w\s]+', '')
df
text
0 ab
1 hgh12
2 abc123
3 1234
这很容易编码,并且可读性很强,但速度很慢.
regex.sub
这涉及使用re库中的sub函数.为性能预编译正则表达式模式,并在列表解析中调用regex.sub.如果你可以节省一些内存,事先将df [‘text’]转换为一个列表,你将获得一个很好的性能提升.
import re
p = re.compile(r'[^\w\s]+')
df['text'] = [p.sub('', x) for x in df['text'].tolist()]
df
text
0 ab
1 hgh12
2 abc123
3 1234
注意:如果您的数据具有NaN值,则此(以及下面的下一个方法)将无法正常工作.请参阅“其他注意事项”部分.
str.translate
python的str.translate函数在C中实现,因此非常快.
这是如何工作的:
>首先,使用您选择的单个(或多个)字符分隔符将所有字符串连接在一起以形成一个巨大的字符串.您必须使用可保证不属于数据的字符/子字符串.
>对大字符串执行str.translate,删除标点符号(排除第1步中的分隔符).
>在步骤1中用于连接的分隔符上拆分字符串.结果列表必须与初始列具有相同的长度.
在这个例子中,我们考虑管道分离器.如果您的数据包含管道,则必须选择另一个分隔符.
import string
punct = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{}~' # `|` is not present here
transtab = str.maketrans(dict.fromkeys(punct, ''))
df['text'] = '|'.join(df['text'].tolist()).translate(transtab).split('|')
df
text
0 ab
1 hgh12
2 abc123
3 1234
性能
到目前为止,str.translate表现最好.请注意,下图包含MaxU’s answer的另一个变量Series.str.translate.
(有趣的是,我第二次重申这一点,结果与之前略有不同.在第二次运行期间,似乎re.sub在str.translate上赢得了非常少量的数据.)
使用翻译有一个固有的风险(特别是,决定使用哪个分隔符的过程自动化的问题是非平凡的),但是权衡取舍是值得冒险的.
其他考虑因素
使用列表推导方法处理NaN;请注意,只有您的数据没有NaN时,此方法(以及下一个方法)才有效.处理NaN时,您必须确定非空值的索引并仅替换它们.尝试这样的事情:
df = pd.DataFrame({'text': [
'a..b?!??', np.nan, '%hgh&12','abc123!!!', '$$$1234', np.nan]})
idx = np.flatnonzero(df['text'].notna())
col_idx = df.columns.get_loc('text')
df.iloc[idx,col_idx] = [
p.sub('', x) for x in df.iloc[idx,col_idx].tolist()]
df
text
0 ab
1 NaN
2 hgh12
3 abc123
4 1234
5 NaN
处理DataFrames;如果您正在处理DataFrames,其中每列需要替换,过程很简单:
v = pd.Series(df.values.ravel())
df[:] = translate(v).values.reshape(df.shape)
要么,
v = df.stack()
v[:] = translate(v)
df = v.unstack()
请注意,下面使用基准测试代码定义translate函数.
每个解决方案都有权衡,因此决定最适合您需求的解决方案将取决于您愿意牺牲的内容.两个非常常见的考虑因素是性能(我们已经看到)和内存使用情况. str.translate是一个需要内存的解决方案,因此请谨慎使用.
另一个考虑因素是你的正则表达式的复杂性.有时,您可能希望删除任何非字母数字或空格的内容. Othertimes,你需要保留某些字符,如连字符,冒号和句子终结符[.!?].指定这些明确增加了正则表达式的复杂性,这可能反过来影响这些解决方案的性能.确保测试这些解决方案
关于您的数据,然后再决定使用什么.
最后,使用此解决方案将删除unicode字符.你可能想调整你的正则表达式(如果使用基于正则表达式的解决方案),或者只是使用str.translate.
为了获得更高的性能(对于更大的N),请在Paul Panzer之前查看这个答案.
附录
功能
def pd_replace(df):
return df.assign(text=df['text'].str.replace(r'[^\w\s]+', ''))
def re_sub(df):
p = re.compile(r'[^\w\s]+')
return df.assign(text=[p.sub('', x) for x in df['text'].tolist()])
def translate(df):
punct = string.punctuation.replace('|', '')
transtab = str.maketrans(dict.fromkeys(punct, ''))
return df.assign(
text='|'.join(df['text'].tolist()).translate(transtab).split('|')
)
# MaxU's version (https://stackoverflow.com/a/50444659/4909087)
def pd_translate(df):
punct = string.punctuation.replace('|', '')
transtab = str.maketrans(dict.fromkeys(punct, ''))
return df.assign(text=df['text'].str.translate(transtab))
绩效基准代码
from timeit import timeit
import pandas as pd
import matplotlib.pyplot as plt
res = pd.DataFrame(
index=['pd_replace', 're_sub', 'translate', 'pd_translate'],
columns=[10, 50, 100, 500, 1000, 5000, 10000, 50000],
dtype=float
)
for f in res.index:
for c in res.columns:
l = ['a..b?!??', '%hgh&12','abc123!!!', '$$$1234'] * c
df = pd.DataFrame({'text' : l})
stmt = '{}(df)'.format(f)
setp = 'from __main__ import df, {}'.format(f)
res.at[f, c] = timeit(stmt, setp, number=30)
ax = res.div(res.min()).T.plot(loglog=True)
ax.set_xlabel("N");
ax.set_ylabel("time (relative)");
plt.show()
python删除标点_python – 使用pandas快速删除标点符号相关推荐
- python列表批量删除元素_Python基础--list列表删除元素
列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法: 根据元素本身的值进行删除,可使用列表(list类型)提供的 remove ...
- 删除oracle怎么快,如何快速删除Oracle的好方法
如何快速删除Oracle的好方法 在Windows系统下运行注册表删除oracle是比较常用的一种方法. 首先在"服务"中关闭启动的oracle项,然后在进程中找到jusched. ...
- 如何删除多个计算机名称,电脑双系统怎么删除一个呢?教你快速删除
电脑双系统怎么删除一个呢?有的朋友电脑上面安装了2个系统,由于占用电脑的空间太大了,想要删除其中的一个系统怎么删除呢?下面小编给您介绍了电脑双系统删除一个详细的使用教程,需要的朋友可以参考下. 有不少 ...
- python删除列索引_python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)...
前言 最近在网上搜了许多关于pandas.DataFrame的操作说明,都是一些基础的操作,但是这些操作组合起来还是比较费时间去正确操作DataFrame,花了我挺长时间去调整BUG的.我在这里做一些 ...
- python文件读写_python文件操作-读写删除复制总结
1. read三种不同的方式 f = open('hello.txt') #'hello.txt'指的是文件的名称 while True: text = f.readline() #读取文件指针指向的 ...
- python集合运算_Python 集合set()添加删除、交集、并集、集合操作详解
在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法 ...
- python索引字符串_Python:通过索引删除子字符串
我有以下相当简单的片段: def delete_substring_blocks(s, blocks): ''' s: original input string blocks: list of in ...
- python数据分析知识点_Python数据分析--Pandas知识点(三)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. 下面将是在知识点一, 二的基础上继续总结. 前面所介绍的都是以表格的形式中展现数据, 下面将介绍Pandas与Matpl ...
- python海龟教程_Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环...
条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...
- python寻峰算法_python中的快速寻峰与质心
我正在尝试用python开发一个快速算法来查找图像中的峰值,然后找到这些峰值的质心.我已经用scipy.ndimage.label和ndimage.find_对象编写了以下代码来定位对象.这似乎是代码 ...
最新文章
- 群晖NAS百度云Docker客户端下载目录没有权限的问题解决
- Tensroflow随笔-测试集
- 基于 SOA 的组件化业务基础平台
- 到 2022 年,75% 的数据库将托管在云端
- 华为鸿蒙生态最新消息,魅族加入华为鸿蒙生态?大家先别高兴,此鸿蒙非彼鸿蒙...
- Java基础篇:循环语句之do-while循环
- javassist使用指南
- 自动控制——2、为什么用微分方程来表示线性定常系统
- 维基百科数据导入mysql数据库并进行检索操作
- elasticsearch学习 part4
- 学计算机网络技术遇到问题,维护计算机网络教室的常见问题及解决方案
- word修订模式怎么彻底关闭_如何去掉word修订模式
- 基于java+SpringBoot+HTML+Mysql学生宿舍管理系统
- unity 设置图片九宫格_Unity UGUI篇 Image图片
- 分布式数据库系统之【结构】
- c语言expand函数,练习 3-3 编写函数expand(s1, s2) (C语言 + 详细注释)
- 师范生计算机软件技能怎么写,计算机与信息科学学院 软件学院第十三届 师范生课堂教学技能竞赛...
- Netty —— Netty 模型
- iOS10会带来哪些新变化?
- 武汉理工大学计算机科学导论 针对复习
热门文章
- 软件自动化测试脚本如何写,(最新整理)自动化测试脚本编写规范
- RB750 固件升级 图文
- stm32开发环境:vs201x+visualGDB+cubemx开发stm32程序
- 转:C#数字、16进制字符串和字节之间互转 bin2hex
- matlab:蚁群算法原理的实现
- 缺少tlqcu_qcu1.conf文件
- Python:科赫曲线绘制雪花
- MAX30102心率血样模块在STM32F103芯片的程序说明
- 保险中介3.0时代:数字化中介在场景中打造核心竞争力
- 进销存erp系统价格