Python 更改dafaframe列中空格后的最后一个单词
我正在处理一个包含计算机名的数据框,我正在尝试匿名化计算机名。这是我正在使用的数据帧的一个示例Python 更改dafaframe列中空格后的最后一个单词,python,pandas,re,Python,Pandas,Re,我正在处理一个包含计算机名的数据框,我正在尝试匿名化计算机名。这是我正在使用的数据帧的一个示例 df = pd.DataFrame({'id': [1, 2, 3, 4, 5], 'computer_name': [u'LENOVO 09 X32H0GB', u'LENOVO vmhsbpmh613.xyz.biz', u'Dell Inc. PowerEdge R910 XKF2S75', u'HP ppesfesxb203.corp.123.com', 'IBM SoftLayer 13
df = pd.DataFrame({'id': [1, 2, 3, 4, 5], 'computer_name': [u'LENOVO 09 X32H0GB', u'LENOVO vmhsbpmh613.xyz.biz', u'Dell Inc. PowerEdge R910 XKF2S75', u'HP ppesfesxb203.corp.123.com', 'IBM SoftLayer 13 L89P4567']})
以下是匿名化的要求
df = pd.DataFrame({'id': [1, 2, 3, 4, 5], 'computer_name': [u'LENOVO 09 xxxH0GB', u'LENOVO xxxsbpmh613', u'Dell Inc. PowerEdge R910 xxx2S75', u'HP xxxsfesxb203', 'IBM SoftLayer 13 xxxP4567']})
我希望,我能够清楚地表达需求,谢谢。这听起来像是regex的工作。以下是一些选项:
# select all chars until reaching a period
df['computer_name'].str.extract('([^.]*)')
# alternatively, replace all chars after a period with an empty string (delete it)
df['computer_name'].str.replace('\..*','')
# For your 3rd requirement, select all non space chars at the end of a string and format the result using match groups.
df['computer_name'].str.replace('([^\s]{3})([^\s]*$)', r'xxx\2',)
首先在右侧的第一个空格上拆分:
s=df.computer\u name.str.rsplit(n=1,expand=True)
# 0 1
#0联想09 X32H0GB
#1联想vmhsbpmh613.xyz.biz
#2戴尔公司PowerEdge R910 XKF2S75
#3 HP PPESXB203.corp.123.com
#4 IBM SoftLayer 13 L89P4567
然后在第一个点和前3个字符上,使用xxx
:
s[1]=s[1]。str.split('.',n=1)。str[0]。替换(r'^…,'xxx',regex=True)
# 0 1
#0.09 xxxH0GB
#1联想xxxsbpmh613
#2戴尔公司PowerEdge R910 xxx2S75
#3 HP xxxsfesxb203
#4 IBM SoftLayer 13 xxxP4567
并通过重新组合拆分来完成:
df.computer\u name=s[0]+''+s[1]
#id计算机名称
#0 1联想09 xxxH0GB
#1 2联想xxxsbpmh613
#2 3戴尔公司PowerEdge R910 xxx2S75
#3 4 HP xxxsfesxb203
#4 5 IBM SoftLayer 13 xxxP4567
正则表达式详细信息
:将所有非空白字符精确匹配\S{3}
3次
:捕获组匹配1到无限次之间的任何非空白字符,但匹配次数尽可能少(惰性匹配)(\S+?)
:非捕获组的开始(?:
:匹配\.
字符
:匹配任何非空白字符\S+
:断言行末尾的位置$
:结束非捕获组)
请看@Royce,谢谢,它几乎成功了。。。唯一的问题是第3行“Dell Inc.PowerEdge R910 XKF2S75”发出“Dell xxx”,我需要“Dell Inc.PowerEdge R910 xxx2S75”“,就像我在问题的第2点中提到的好用分割:)@tdy,谢谢你,这确实很好…谢谢@tdy我不确定它是否更好,但我仍在努力改进模式,有很多角落的情况下,这种模式会失败:-)@Shubham,这很好,谢谢你。。。你介意解释一下正则表达式吗。。。那真的能帮我解决这个问题learning@Vikram我已经编辑了答案。
df['computer_name'].str.replace(r'\S{3}(\S+?)(?:\.\S+|$)', r'xxx\1')
0 LENOVO 09 xxxH0GB
1 LENOVO xxxsbpmh613
2 Dell Inc. PowerEdge R910 xxx2S75
3 HP xxxsfesxb203
4 IBM SoftLayer 13 xxxP4567
Name: computer_name, dtype: object