更改数据框列中 space 之后的最后一个字
Change last word after space in a dafaframe column
我正在处理一个包含计算机名称的数据框,我正在尝试匿名化计算机名称。这是数据框的示例,我正在使用
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']})
这是匿名化所需要的。
从 RIGHT 中第一个 SPACE 之后选择 RIGHT 中的第一组字符串 ..
例如:对于“LENOVO vmhsbpmh613.xyz.biz”,它将是“vmhsbpmh613.xyz.biz”
从右侧获取第一组字符串后,例如“vmhsbpmh613.xyz.biz”,删除第一个点 (.) 中的所有字符,这将给出“vmhsbpmh613”,如果有没有点 (.) 然后仅保留最后一组字符串,请注意仅从右侧的第一组字符串中删除点 (.) 之后的字符串很重要,否则就像本例中的“Dell Inc. PowerEdge R910 XKF2S75 " 这将导致删除点后的所有内容 " Dell Inc. "
最后将前3个字符替换为xxx,如xxxsbpmh613
输出应该是这样的
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']})
我希望,我能够清楚地表达需求,谢谢。
这听起来像是正则表达式的工作。这里有一些选项:
# 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',)
第一个 rsplit()
拆分在第一个 space 从右边:
s = df.computer_name.str.rsplit(n=1, expand=True)
# 0 1
# 0 LENOVO 09 X32H0GB
# 1 LENOVO vmhsbpmh613.xyz.biz
# 2 Dell Inc. PowerEdge R910 XKF2S75
# 3 HP ppesfesxb203.corp.123.com
# 4 IBM SoftLayer 13 L89P4567
然后 split()
on the first dot and replace()
前 3 个字符 xxx
:
s[1] = s[1].str.split('.', n=1).str[0].replace(r'^...', 'xxx', regex=True)
# 0 1
# 0 LENOVO 09 xxxH0GB
# 1 LENOVO xxxsbpmh613
# 2 Dell Inc. PowerEdge R910 xxx2S75
# 3 HP xxxsfesxb203
# 4 IBM SoftLayer 13 xxxP4567
并通过重新组合拆分来完成:
df.computer_name = s[0] + ' ' + s[1]
# id computer_name
# 0 1 LENOVO 09 xxxH0GB
# 1 2 LENOVO xxxsbpmh613
# 2 3 Dell Inc. PowerEdge R910 xxx2S75
# 3 4 HP xxxsfesxb203
# 4 5 IBM SoftLayer 13 xxxP4567
Series.str.replace
df['computer_name'].str.replace(r'\S{3}(\S+?)(?:\.\S+|$)', r'xxx')
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
正则表达式详细信息
\S{3}
:匹配任何非空白字符 3
次。
(\S+?)
:捕获组匹配任何非空白字符 1 到无限次,但次数尽可能少(惰性匹配)
(?:
: 非捕获组的开始
\.
: 匹配 .
个字符
\S+
: 计算任何非空白字符
$
:断言位置在行尾
)
: 非捕获组结束
我正在处理一个包含计算机名称的数据框,我正在尝试匿名化计算机名称。这是数据框的示例,我正在使用
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']})
这是匿名化所需要的。
从 RIGHT 中第一个 SPACE 之后选择 RIGHT 中的第一组字符串 .. 例如:对于“LENOVO vmhsbpmh613.xyz.biz”,它将是“vmhsbpmh613.xyz.biz”
从右侧获取第一组字符串后,例如“vmhsbpmh613.xyz.biz”,删除第一个点 (.) 中的所有字符,这将给出“vmhsbpmh613”,如果有没有点 (.) 然后仅保留最后一组字符串,请注意仅从右侧的第一组字符串中删除点 (.) 之后的字符串很重要,否则就像本例中的“Dell Inc. PowerEdge R910 XKF2S75 " 这将导致删除点后的所有内容 " Dell Inc. "
最后将前3个字符替换为xxx,如xxxsbpmh613
输出应该是这样的
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']})
我希望,我能够清楚地表达需求,谢谢。
这听起来像是正则表达式的工作。这里有一些选项:
# 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',)
第一个 rsplit()
拆分在第一个 space 从右边:
s = df.computer_name.str.rsplit(n=1, expand=True)
# 0 1
# 0 LENOVO 09 X32H0GB
# 1 LENOVO vmhsbpmh613.xyz.biz
# 2 Dell Inc. PowerEdge R910 XKF2S75
# 3 HP ppesfesxb203.corp.123.com
# 4 IBM SoftLayer 13 L89P4567
然后 split()
on the first dot and replace()
前 3 个字符 xxx
:
s[1] = s[1].str.split('.', n=1).str[0].replace(r'^...', 'xxx', regex=True)
# 0 1
# 0 LENOVO 09 xxxH0GB
# 1 LENOVO xxxsbpmh613
# 2 Dell Inc. PowerEdge R910 xxx2S75
# 3 HP xxxsfesxb203
# 4 IBM SoftLayer 13 xxxP4567
并通过重新组合拆分来完成:
df.computer_name = s[0] + ' ' + s[1]
# id computer_name
# 0 1 LENOVO 09 xxxH0GB
# 1 2 LENOVO xxxsbpmh613
# 2 3 Dell Inc. PowerEdge R910 xxx2S75
# 3 4 HP xxxsfesxb203
# 4 5 IBM SoftLayer 13 xxxP4567
Series.str.replace
df['computer_name'].str.replace(r'\S{3}(\S+?)(?:\.\S+|$)', r'xxx')
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
正则表达式详细信息
\S{3}
:匹配任何非空白字符3
次。(\S+?)
:捕获组匹配任何非空白字符 1 到无限次,但次数尽可能少(惰性匹配)(?:
: 非捕获组的开始\.
: 匹配.
个字符\S+
: 计算任何非空白字符$
:断言位置在行尾)
: 非捕获组结束