更改dafaframe列中空格后的最后一个单词

2024-09-30 05:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个包含计算机名的数据框,我正在尝试匿名化计算机名。这是我正在使用的数据帧的一个示例

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']})

以下是匿名化的要求

  1. 从右侧第一个空格后的右侧拾取第一组字符串。。 例如:“联想vmhsbpmh613.xyz.biz”应该是“vmhsbpmh613.xyz.biz”

  2. 从右侧获取第一组字符串(如“vmhsbpmh613.xyz.biz”)后,删除第一个点(.)中的所有字符,这将给出“vmhsbpmh613”,如果没有点(.),则只保留最后一组字符串,请注意,从右侧第一组字符串中仅删除点(.)之后的字符串非常重要,否则,如本例中的“Dell Inc.PowerEdge R910 XKF2S75”,将导致删除Dot“Dell Inc.”之后的所有内容

  3. 最后,用xxx替换前3个字符,如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']})

我希望,我能够清楚地表达需求,谢谢


Tags: 数据字符串iddataframedf计算机dellinc
3条回答

第一个^{}从右侧开始在第一个空格上拆分:

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

然后^{}在第一个点上^{}在前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

^{}

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

正则表达式详细信息

  • \S{3}:与任何非空白字符外部匹配3
  • (\S+?):捕获组匹配1到无限次之间的任何非空白字符,但匹配次数尽可能少(惰性匹配)
  • (?::非捕获组的开始
  • \.:匹配.字符
  • \S+:匹配任何非空白字符
  • $:断言行末尾的位置
  • ):结束非捕获组

^{}

这听起来像是正则表达式的工作。以下是一些选项:

# 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',)

相关问题 更多 >

    热门问题