当不是每个人都有中间名的时候,把名字分为第一名、中间名和最后一名

2024-04-29 12:12:15 发布

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

我有一个df看起来有点像这样:

name                           id
John McNamara                  3498
Jane Adams, M.D.               6725
Nour Abd Almohsen Jr M.D.      0197
Alex Ambrose PhD               3287
Nancy Ann Brown, MPH, PhD      9127
Kathy W.                       4389
Jack Joshua Smith White        6756

我需要将name列分为first name、middle name、last name、suffix和title。通常我会使用类似.str.split的东西,但在这种情况下,并不是每个人都有中间名、后缀或标题。另外,有些值有逗号分隔,有些没有。有什么方法可以解释这些差异吗?你知道吗

理想情况下,我希望我的输出如下所示:

first_name middle_name last_name    suffix title     id
John                   McNamara                      3498
Jane                   Adams               M.D.      6725
Nour       Abd         Almohsen     Jr     M.D.      0197
Alex                   Ambrose             PhD       3287
Nancy      Ann         Brown               MPH, PhD  9127
Jack       J           Smith White

编辑:我知道这需要多个步骤,包括去除标点符号。我发现有些事情特别棘手:

  • 如果我使用pd.concat([df['id'], df['name'].str.split(' ', expand=True)], axis=1)这样的名字,比如Jack Joshua Smith-White,最后会被分成多个“中间名”列,其中Smith和其他人的姓在同一列中。有没有办法让最后一个字符串自动进入最后一列? 我试着用df['last\u name'].fillna(df['middle\u name'],inplace=True)来解决这个问题,但这不起作用,因为有时人们有多个“中间名”,我需要一种方法来选择最新的中间名,而不是None。你知道吗

Tags: nameidmiddledfjohnlastsmithwhite
1条回答
网友
1楼 · 发布于 2024-04-29 12:12:15

如果您能够在dataframe中获得所有可能的标题,那么可以像这样解析您的名称:

import pandas as pd

# Create the dataframe with provided sample data
names = ['John McNamara','Nour Abd Almohsen Jr M.D.','Nancy Ann Brown, MPH, PhD','MPH']
med_id = ['3498', '6725', '0197', '3287', '9127','']

df = pd.DataFrame(list(zip(names, med_id)), columns =['name', 'id']) 
names = df['name'].to_list()


# List to fill up given the dataframe content
suffix = ['M.D.', 'PhD', 'MPH']
garbages = [',']

# iterate over all the name in your list
clean_names = []
first_name = []
middle_name = []
last_name = []
title = []

# Remove suffix and junk from the names
for name in names:
    to_remove = suffix + garbages
    clean_name = name
    for element in to_remove:
        clean_name = clean_name.replace(element, '')
    clean_names.append(clean_name)

# split the clean_names into first middle and last name
for (name,original_name) in zip(clean_names,names):
    data = name.split()

    # error checking for messed up entries
    if len(data) < 2:
        first_name.append("")
        middle_name.append("")
        last_name.append("")
        title.append("")
        print("Entry : " + original_name + " is malformed")
        continue

    # Add the right firstname lastname and middle name structure
    first_name.append(data[0])
    if len(data) == 2:
        middle_name.append("")
        last_name.append(data[1])
    else:
        middle_name.append(data[1])
        last_name.append(" ".join(data[2:]))

    # Add the right title
    title.append(' ,'.join([suf for suf in suffix if suf in original_name]))

df['first_name'] = first_name
df['middle_name'] = middle_name
df['last_name'] = last_name
df['title'] = title
df = df.drop(columns = ['name','id'])

print(df)

以下是您提供的输出,包括一个有问题的条目: enter image description here

但是,数据集在标点符号方面看起来非常不规则

相关问题 更多 >