Python去除姓名字符串末尾的中间名缩写

3

我正在尝试移除名字字符串末尾的中间名缩写。数据看起来像这样:

df = pd.DataFrame({'Name': ['Smith, Jake K',
                            'Howard, Rob',
                            'Smith-Howard, Emily R',
                            'McDonald, Jim T',
                            'McCormick, Erica']})

我目前使用的以下代码对所有姓名均有效,但无法正确处理 "McCormick, Erica"。我首先使用正则表达式来识别所有大写字母,然后将任何有三个或更多大写字母的行中从字符串中删除 [:-1](尝试删除中间的名字和额外空格)。

df['Cap_Letters'] = df['Name'].str.findall(r'[A-Z]')
df.loc[df['Cap_Letters'].str.len() >= 3, 'Name'] = df['Name'].str[:-1]

以下是输出结果:

enter image description here

正如您所看到的,这将正确地删除除McCormick, Erica之外所有姓名的中间名称缩写。 原因是她有3个大写字母但没有中间名称缩写,这会错误地删除Erica中的'a'。


如果所有的中间名都是字符串中的最后一个单词,并且由空格分隔,您尝试过使用字符串的 split 方法吗? - JoshuaF
3个回答

4
您可以直接使用Series.str.replace函数:
df['Name'] = df['Name'].str.replace(r'\s+[A-Z]$', '', regex=True)

输出:

0            Smith, Jake
1            Howard, Rob
2    Smith-Howard, Emily
3          McDonald, Jim
4       McCormick, Erica
Name: Name, dtype: object

查看正则表达式演示正则表达式详情:

  • \s+ - 一个或多个空格
  • [A-Z] - 大写字母
  • $ - 字符串结尾

2
另一种解决方案(不太优美)是先拆分,然后取两个元素,再重新组合。
df['Name'] = df['Name'].str.split().str[0:2].str.join(' ')

# 0            Smith, Jake
# 1            Howard, Rob
# 2    Smith-Howard, Emily
# 3          McDonald, Jim
# 4       McCormick, Erica
# Name: Name, dtype: object

1
我会使用类似这样的东西:
def removeMaj(string):
   tab=string.split(',')
   tab[1]=lower(tab[1])
   string=",".join(tab)
   return(string)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接