Я пытаюсь разделить полное имя на первую середину и фамилию в пандах, но я застрял на замене

Я пытаюсь разбить имя на две части, сохраняя фамилию и фамилию и, наконец, заменяя общую часть во всех них, так что сначала имя должно быть фамилией, тогда, если останется второе имя, оно добавляется в столбец

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:« Series »изменяемы, поэтому они не могут быть хэшированы»

есть ли в пандах какой-либо запасной ситакс для того, что я пытаюсь достичь

мой желаемый результат

полное имя = THOMAS MARY D, которое находится в столбце owner1_name

я хочу

 owner1_first_name = THOMAS owner1_middle_name = MARY owner1_last_name = D 

Я думаю, вам нужна 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 по строкам возможно применение apply с axis=1 :

 df = 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 abc 0 THOMAS MARY-THOMAS THOMAS MARY-THOMAS MARY- 1 JOE LongJOE JOE LongJOE Long 2 MARY Small MARY Small Small 

точный код в три строки для достижения того, что я хотел в моем вопросе, – это

 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) 

Просто измените свое назначение и используйте другую переменную:

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