我想把全名分成三栏,例如名字、中间名和姓,例如:
1 Moni Avhad
2 Kumar Krishnan Menon
3 Divya Sharma
4 Mimi Atul Sharma
5 Murad Oberoi
我使用了下面的代码来拆分名称:
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
但很多时候,我的全名不是常量,例如,我的全名(,)有三个独立的名字
预期产出:
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。
发布于 2022-08-16 10:12:12
这不是最优雅的方式,但您可以使用:
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])
这样做的好处是,如果一个人有一个以上的中间名,代码就不会失败。此外,在数据帧的列名中保留空格和/或特殊字符也是坏习惯。最好把这事处理好。
发布于 2022-08-16 10:16:25
使用没有n=2
和空格的解决方案,然后用middle
值替换Last
列中缺少的值,并设置None
:
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
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
发布于 2022-08-16 10:18:34
只有在字符串长度为3时,才能使用pd.str.split
并填充中间名称列。
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]
这给了我们预期的产出:
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
https://stackoverflow.com/questions/73372127
复制相似问题