我试图将一个全名拆分为熊猫中的第一个中间名和姓,但我被困在替换中

时间:2017-06-07 07:28:25

标签: python pandas data-cleaning

我试图将名称分成两部分并保留名字姓氏,最后替换所有名称中的公共部分,使得名字必须是姓氏然后如果中间名保留则将其添加到列

df['owner1_first_name'] = df['owner1_name'].str.split().str[0].astype(str, 
errors='ignore')
df['owner1_last_name'] = 
df['owner1_name'].str.split().str[-1].str.replace(df['owner1_first_name'], 
"").astype(str, errors='ignore')
['owner1_middle_name'] = 
df['owner1_name'].str.replace(df['owner1_first_name'], 
"").str.replace(df['owner1_last_name'], "").astype(str, errors='ignore')

问题是我无法使用     .str.replace(df [' owner1_name'],"")
因为我得到一个错误     " TypeError:'系列'对象是可变的,因此它们不能被散列"

pandas中是否有任何替代sytax用于我想要实现的目标

我想要的输出是

全名= THOMAS MARY D,位于owner1_name列

我想要

owner1_first_name = THOMAS
owner1_middle_name = MARY
owner1_last_name = D

3 个答案:

答案 0 :(得分:1)

我认为你需要mask,它将两列中的相同值替换为空字符串:

df = pd.DataFrame({'owner1_name':['THOMAS MARY D', 'JOE Long', 'MARY Small']})

splitted = df['owner1_name'].str.split()
df['owner1_first_name'] = splitted.str[0]
df['owner1_last_name'] = splitted.str[-1]
df['owner1_middle_name'] = splitted.str[1]
df['owner1_middle_name'] = df['owner1_middle_name']
                             .mask(df['owner1_middle_name'] == df['owner1_last_name'], '')
print (df)
     owner1_name owner1_first_name owner1_last_name owner1_middle_name
0  THOMAS MARY D            THOMAS                D               MARY
1       JOE Long               JOE             Long                   
2     MARY Small              MARY            Small  

与...相同:

splitted = df['owner1_name'].str.split()
df['owner1_first_name'] = splitted.str[0]
df['owner1_last_name'] = splitted.str[-1]
middle = splitted.str[1] 
df['owner1_middle_name'] = middle.mask(middle == df['owner1_last_name'], '')
print (df)
     owner1_name owner1_first_name owner1_last_name owner1_middle_name
0  THOMAS MARY D            THOMAS                D               MARY
1       JOE Long               JOE             Long                   
2     MARY Small              MARY            Small                   

编辑:

对于行replace,可以axis=1df = pd.DataFrame({'owner1_name':['THOMAS MARY-THOMAS', 'JOE LongJOE', 'MARY Small']}) splitted = df['owner1_name'].str.split() df['a'] = splitted.str[0] df['b'] = splitted.str[-1] df['c'] = df.apply(lambda x: x['b'].replace(x['a'], ''), axis=1) print (df) owner1_name a b c 0 THOMAS MARY-THOMAS THOMAS MARY-THOMAS MARY- 1 JOE LongJOE JOE LongJOE Long 2 MARY Small MARY Small Small 一起使用{/ 1}}:

df['owner1_first_name'] = df['owner1_name'].str.split().str[0]
df['owner1_last_name'] = df.apply(lambda x: x['owner1_name'].split()
[-1].replace(x['owner1_first_name'], ''), axis=1)
df['owner1_middle_name'] = df.apply(lambda x: 
x['owner1_name'].replace(x['owner1_first_name'], 
'').replace(x['owner1_last_name'], ''), axis=1)

在我的问题中实现我想要的三行中的确切代码是

{{1}}

答案 1 :(得分:0)

只需更改作业并使用其他变量:

split = df['owner1_name'].split()
df['owner1_first_name'] = split[0]
df['owner1_middle_name'] = split[-1]
df['owner1_last_name'] = split[1]

答案 2 :(得分:0)

splitted = df['Contact_Name'].str.split()
df['First_Name'] = splitted.str[0]
df['Last_Name'] = splitted.str[-1]
df['Middle_Name'] = df['Contact_Name'].loc[df['Contact_Name'].str.split().str.len() == 3].str.split(expand=True)[1]

这可能会有所帮助!这里的部分是正确插入您可以通过此代码执行的中间名。