У меня есть данные, содержащие полное имя и имя, и мне нужно создать новый столбец с фамилией. Могу предположить полное - первое = последнее.
Я пытался использовать срез с индексом, длина которого равна имени + 1. Но этот индекс представляет собой серию, а не целое число. Итак, он возвращает NaN.
В закомментированных строках показано, что я пробовал. Мне потребовалось некоторое время, чтобы понять, в чем заключалась проблема с рядом/целым числом. Кажется, это не должно быть так сложно.
Спасибо
import pandas as pd
columns = ['Full', 'First']
data = [('Joe Smith', 'Joe'), ('Bobby Sue Ford', 'Bobby Sue'), ('Current Resident', 'Current Resident'), ('', '')]
df = pd.DataFrame(data, columns=columns)
#first_chars = df['First'].str.len() + 1
#last = df['Full'].str[4:]
#last = df['Full'].str[first_chars:]
#last = df['Full'].str.slice(first_chars)
#last = df.Full.str[first_chars:]
#pd.DataFrame.insert(df, loc=2, column='Last', value=last)
#df['Last'] = df.Full.str[first_chars:]
#df['Last'] = str(df.Full.str[first_chars:])
#first_chars = int(first_chars)
#df['Last'] = df['Full'].apply(str).apply(lambda x: x[first_chars:])
df['Last'] = df['Full'].str.slice(df['First'].str.len() + 1)
print(df)
Редактировать:
Используйте removeprefix
вместо replace
в случаях, когда имя и фамилия совпадают:
df['Last'] = df.apply(lambda row: row['Full'].removeprefix(row['First']).strip(), axis=1)
Full First Last
0 Joe Smith Joe Smith
1 Bobby Sue Ford Bobby Sue Ford
2 Current Resident Current Resident
3
4 Joe Joe Joe Joe
Оригинальный ответ:
Используйте apply
на axis=1
-replace
каждого имени:
df['Last'] = df.apply(lambda row: row['Full'].replace(row['First'], '').strip(), axis=1)
Full First Last
0 Joe Smith Joe Smith
1 Bobby Sue Ford Bobby Sue Ford
2 Current Resident Current Resident
3
IIUC, вы можете сделать это таким образом, используя нарезку строк, понимание списка и zip
:
df['Last'] = [u[len(i)+1:] for u, i in zip(df['Full'], df['First'])]
Выход:
Full First Last
0 Joe Smith Joe Smith
1 Bobby Sue Ford Bobby Sue Ford
2 Current Resident Current Resident
3
Подробности:
@JWeb Это должно быть более эффективно, чем apply
с axis=1
Оба опубликованных ответа сработали. Я выберу этот вариант, потому что мне сразу понятно, что вы делаете. Спасибо!