建立

出于演示的目的,让我们考虑一下这个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快速删除标点符号相关推荐

  1. python列表批量删除元素_Python基础--list列表删除元素

    列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法: 根据元素本身的值进行删除,可使用列表(list类型)提供的 remove ...

  2. 删除oracle怎么快,如何快速删除Oracle的好方法

    如何快速删除Oracle的好方法 在Windows系统下运行注册表删除oracle是比较常用的一种方法. 首先在"服务"中关闭启动的oracle项,然后在进程中找到jusched. ...

  3. 如何删除多个计算机名称,电脑双系统怎么删除一个呢?教你快速删除

    电脑双系统怎么删除一个呢?有的朋友电脑上面安装了2个系统,由于占用电脑的空间太大了,想要删除其中的一个系统怎么删除呢?下面小编给您介绍了电脑双系统删除一个详细的使用教程,需要的朋友可以参考下. 有不少 ...

  4. python删除列索引_python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)...

    前言 最近在网上搜了许多关于pandas.DataFrame的操作说明,都是一些基础的操作,但是这些操作组合起来还是比较费时间去正确操作DataFrame,花了我挺长时间去调整BUG的.我在这里做一些 ...

  5. python文件读写_python文件操作-读写删除复制总结

    1. read三种不同的方式 f = open('hello.txt') #'hello.txt'指的是文件的名称 while True: text = f.readline() #读取文件指针指向的 ...

  6. python集合运算_Python 集合set()添加删除、交集、并集、集合操作详解

    在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法 ...

  7. python索引字符串_Python:通过索引删除子字符串

    我有以下相当简单的片段: def delete_substring_blocks(s, blocks): ''' s: original input string blocks: list of in ...

  8. python数据分析知识点_Python数据分析--Pandas知识点(三)

    本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. 下面将是在知识点一, 二的基础上继续总结. 前面所介绍的都是以表格的形式中展现数据, 下面将介绍Pandas与Matpl ...

  9. python海龟教程_Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环...

    条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...

  10. python寻峰算法_python中的快速寻峰与质心

    我正在尝试用python开发一个快速算法来查找图像中的峰值,然后找到这些峰值的质心.我已经用scipy.ndimage.label和ndimage.find_对象编写了以下代码来定位对象.这似乎是代码 ...

最新文章

  1. 群晖NAS百度云Docker客户端下载目录没有权限的问题解决
  2. Tensroflow随笔-测试集
  3. 基于 SOA 的组件化业务基础平台
  4. 到 2022 年,75% 的数据库将托管在云端
  5. 华为鸿蒙生态最新消息,魅族加入华为鸿蒙生态?大家先别高兴,此鸿蒙非彼鸿蒙...
  6. Java基础篇:循环语句之do-while循环
  7. javassist使用指南
  8. 自动控制——2、为什么用微分方程来表示线性定常系统
  9. 维基百科数据导入mysql数据库并进行检索操作
  10. elasticsearch学习 part4
  11. 学计算机网络技术遇到问题,维护计算机网络教室的常见问题及解决方案
  12. word修订模式怎么彻底关闭_如何去掉word修订模式
  13. 基于java+SpringBoot+HTML+Mysql学生宿舍管理系统
  14. unity 设置图片九宫格_Unity UGUI篇 Image图片
  15. 分布式数据库系统之【结构】
  16. c语言expand函数,练习 3-3 编写函数expand(s1, s2) (C语言 + 详细注释)
  17. 师范生计算机软件技能怎么写,计算机与信息科学学院 软件学院第十三届 师范生课堂教学技能竞赛...
  18. Netty —— Netty 模型
  19. iOS10会带来哪些新变化?
  20. 武汉理工大学计算机科学导论 针对复习

热门文章

  1. 软件自动化测试脚本如何写,(最新整理)自动化测试脚本编写规范
  2. RB750 固件升级 图文
  3. stm32开发环境:vs201x+visualGDB+cubemx开发stm32程序
  4. 转:C#数字、16进制字符串和字节之间互转 bin2hex
  5. matlab:蚁群算法原理的实现
  6. 缺少tlqcu_qcu1.conf文件
  7. Python:科赫曲线绘制雪花
  8. MAX30102心率血样模块在STM32F103芯片的程序说明
  9. 保险中介3.0时代:数字化中介在场景中打造核心竞争力
  10. 进销存erp系统价格