python - 在Python中选择性地删除字符串后面的空格

标签 python pandas dataframe

我有以下代码片段:

    import pandas as pd

    df = pd.DataFrame([{'LastName':'VAN HOUTEN'},
                       {'LastName':"O'BOYLE"},
                       {'LastName':'ESTEVAN-GONZALEZ'},
                       {'LastName':'RODRIGO TEIXEIRA'},
                       {'LastName':'ESTEBAN GONZALEZ'}, 
                       {'LastName':'O ROURKE'},
                       {'LastName':'RODRIGO-TEIXEIRA'}])

    delete_space_after_list = ['VAN','O']

    df['NewName'] = df['LastName'].str.replace("'"," ")

    for s in delete_space_after_list[:]:
        df['NewName'] = df['NewName'].str.replace(s + ' ', s)

    df['NewName'] = df['NewName'].str.replace('-'," ")
    df['NewName'] = df['NewName'].str.split().str.get(0)   

运行此代码给出以下结果:

    Index        LastName               NewName
    0            VAN HOUTEN             VANHOUTEN
    1            O'BOYLE                OBOYLE
    2            ESTEVAN-GONZALEZ       ESTEVAN
    3            RODRIGO TEIXEIRA       RODRIGOTEIXEIRA
    4            ESTEVAN GONZALEZ       ESTEVANGONZALEZ
    5            O ROURKE               OROURKE
    6            RODRIGO-TEIXEIRA       RODRIGO

但是期望的输出是这样的

    Index        LastName               DesiredName
    0            VAN HOUTEN             VANHOUTEN
    1            O'BOYLE                OBOYLE
    2            ESTEVAN-GONZALEZ       ESTEVAN
    3            RODRIGO TEIXEIRA       RODRIGO
    4            ESTEVAN GONZALEZ       ESTEVAN
    5            O ROURKE               OROURKE
    6            RODRIGO-TEIXEIRA       RODRIGO

它消除了 RODRIGO 之后的空格(因为 LastName 末尾的“O”)并将其与“TEIXEIRA”连接起来,同样消除了 ESTEVAN 之后的空格(因为 LastName 末尾的“VAN”)并将其与“GONZALEZ”连接起来。但是,它正确地消除了其他名称中的空格。

如何让此代码像 VAN HOUTEN、O'BOYLE、ESTE​​VAN-GONZALEZ、O ROURKE 和 RODRIGO-TEIXEIRA 那样正确删除空格,同时不删除 ESTEVAN GONZALEZ 和 RODRIGO TEIXEIRA 之后的空格?

最佳答案

因此,您想要删除“不太重要”的名称,该名称是由以 OVAN 结尾的名称定义的,但不是being OVAN,并删除其他名称的非字母。

这是正则表达式的工作(或者没有它们,这是一项漫长而痛苦的工作)

我会通过像这样链接2个正则表达式来做到这一点(我将 pandas 排除在外,因为问题与 pandas 没有直接关系):

data = [{'LastName':'VAN HOUTEN'},
                       {'LastName':"O'BOYLE"},
                       {'LastName':'ESTEVAN-GONZALEZ'},
                       {'LastName':'RODRIGO TEIXEIRA'},
                       {'LastName':'ESTEVAN GONZALEZ'}, # not ESTEBAN as in your example!
                       {'LastName':'O ROURKE'},
                       {'LastName':'RODRIGO-TEIXEIRA'}]

import re

new_data = [re.sub("\W","",re.sub("(.)(O|VAN)\W.*",r"\1\2",v['LastName'])) for v in data]

print(new_data)

结果:

['VANHOUTEN', 'OBOYLE', 'ESTEVAN', 'RODRIGO', 'ESTEVAN', 'OROURKE', 'RODRIGO']

所以:

  • "(.)(O|VAN)\W.*" 匹配至少一个字符,后跟 OVAN 前缀,后跟一个非字母 (\W) 和其余的,我们跳过(我们只保留前 2 个组):处理“不太重要的名称”
  • "\W" 删除空格、破折号、引号...所有非字母数字。 Than 处理第二种情况。

关于python - 在Python中选择性地删除字符串后面的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143714/

相关文章:

python - 如何在python中合并pandas字符串(类似连接sql)?

python - 使用旧列表中复制和平均的项目创建新列表

python - 使用Python和Tesseract OCR解决Captcha

python - 使用 Pandas 的箱线图

python - 根据系列或数组中的索引访问 pandas 字符串列字符

Python绘图y轴平均标签不会显示并且日期都很拥挤

python - groupby之后,如何展平列标题?

python - python 中的 fft 没有在正确的位置显示峰值

python - django 中的 URL 模式匹配

python - 您可以在创建新列时引用分配中新创建的列吗?