首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python笔记本中,我如何将全名拆分为名、中名和姓?

在python笔记本中,我如何将全名拆分为名、中名和姓?
EN

Stack Overflow用户
提问于 2022-08-16 09:58:30
回答 5查看 165关注 0票数 1

我想把全名分成三栏,例如名字、中间名和姓,例如:

代码语言:javascript
运行
复制
1   Moni Avhad
2   Kumar Krishnan Menon
3   Divya Sharma
4   Mimi Atul Sharma
5   Murad Oberoi

我使用了下面的代码来拆分名称:

代码语言:javascript
运行
复制
import pandas as pd
df = pd.read_excel("Sample.xlsx")
df[['first Name','middle Name','Last Name']]=df['Full Name'].str.split(' ',n=2,expand=True)
df

但很多时候,我的全名不是常量,例如,我的全名(,)有三个独立的名字

预期产出:

代码语言:javascript
运行
复制
    First Name   Middle Name   Last Name
1   Moni            N/A         Avhad
2   Kumar         Krishnan      Menon
3   Divya           N/A         Sharma
4   Mimi           Atul         Sharma
5   Murad           N/A         Oberoi

此外,如果有多个姓氏,如Rani Amol Warma,我们如何分割它,以及另外一个场景,即没有中间名,但有两个姓氏存在,例如Disha Sharma Warma。

EN

回答 5

Stack Overflow用户

发布于 2022-08-16 10:12:12

这不是最优雅的方式,但您可以使用:

代码语言:javascript
运行
复制
df["FirstName"] = df["FullName"].apply(lambda x : x.split()[0])
df["MiddleName"] = df["FullName"].apply(lambda x : " ".join(x.split()[1:-1]) if len(x.split())>2 else None)
df["LastName"] = df["FullName"].apply(lambda x : x.split()[-1])

这样做的好处是,如果一个人有一个以上的中间名,代码就不会失败。此外,在数据帧的列名中保留空格和/或特殊字符也是坏习惯。最好把这事处理好。

票数 1
EN

Stack Overflow用户

发布于 2022-08-16 10:16:25

使用没有n=2和空格的解决方案,然后用middle值替换Last列中缺少的值,并设置None

代码语言:javascript
运行
复制
df[['first Name','middle Name','Last Name']] = df['Full Name'].str.split(expand=True)

m = df['Last Name'].isna()
df['Last Name'] = df['Last Name'].fillna(df['middle Name'])
df.loc[m, 'middle Name'] = None
print (df)
                  Full Name first Name middle Name Last Name
0                Moni Avhad       Moni        None     Avhad
1      Kumar Krishnan Menon      Kumar    Krishnan     Menon
2              Divya Sharma      Divya        None    Sharma
3          Mimi Atul Sharma       Mimi        Atul    Sharma
4              Murad Oberoi      Murad        None    Oberoi

另一种分裂为Series的方法称为s,并通过Series.mask设置None

代码语言:javascript
运行
复制
s = df['Full Name'].str.split()
df['First_Name'] = s.str[0]
df['Middle_Name'] = s.str[1].mask(s.str.len().ne(3), None)
df['Last_Name'] = s.str[-1]
print (df)
                  Full Name First_Name Middle_Name Last_Name
0                Moni Avhad       Moni        None     Avhad
1      Kumar Krishnan Menon      Kumar    Krishnan     Menon
2              Divya Sharma      Divya        None    Sharma
3          Mimi Atul Sharma       Mimi        Atul    Sharma
4              Murad Oberoi      Murad        None    Oberoi
票数 1
EN

Stack Overflow用户

发布于 2022-08-16 10:18:34

只有在字符串长度为3时,才能使用pd.str.split并填充中间名称列。

代码语言:javascript
运行
复制
splitted = df['Full Name'].str.split()
df['First_Name'] = splitted.str[0]
df['Last_Name'] = splitted.str[-1]
df['Middle_Name'] = df['Full Name'].loc[splitted.str.len() == 3].str.split(expand=True)[1]

这给了我们预期的产出:

代码语言:javascript
运行
复制
  First_Name Middle_Name Last_Name
0       Moni         NaN     Avhad
1      Kumar    Krishnan     Menon
2      Divya         NaN    Sharma
3       Mimi        Atul    Sharma
4      Murad         NaN    Oberoi
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73372127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档