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']})
以下是匿名化的要求

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

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

  • 最后,用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']})
    

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

    这听起来像是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次
    • (\S+?)
      :捕获组匹配1到无限次之间的任何非空白字符,但匹配次数尽可能少(惰性匹配)
    • (?:
      :非捕获组的开始
    • \.
      :匹配
      字符
    • \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