Как получить фрагменты значений переменной длины с помощью Pandas?

У меня есть данные, содержащие полное имя и имя, и мне нужно создать новый столбец с фамилией. Могу предположить полное - первое = последнее.

Я пытался использовать срез с индексом, длина которого равна имени + 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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Редактировать: Используйте 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        

Оба опубликованных ответа сработали. Я выберу этот вариант, потому что мне сразу понятно, что вы делаете. Спасибо!

J Web 19.07.2024 20:59

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                                           

Подробности:

  • Используйте zip для получения списка кортежей пар (Полный, Первый).
  • Создайте цикл понимания списка, просматривая этот список.
  • Для каждого элемента в списке возьмите первый элемент кортежа u и разрежьте его по строке на основе длины плюс 1 второго элемента в кортеже, т. е.

@JWeb Это должно быть более эффективно, чем apply с axis=1

mozway 19.07.2024 21:31

Другие вопросы по теме