Вопрос или проблема
Я написал код для разделения полного имени на Имя, Среднее имя и Фамилию.
import pandas as pd
df= pd.read_excel(r"D:\SAMPLE EXCEL FILES\names.xlsx")
splitted = df['Names'].str.split()
first = splitted.str[0]
middle = splitted[1]
last = splitted.str[-1]
df['First Name'] = first
df['Middle Name'] = middle.mask(middle == last,'')
df['Last Name'] = last
print(df)
Я получаю следующую ошибку:
Traceback (most recent call last):
File "D:/names.py", line 18, in <module>
df['Middle Name'] = middle.mask(middle == last,'')
AttributeError: 'list' object has no attribute 'mask'
Порядок вывода важен: Сначала Имя, потом Среднее имя и Фамилия.
Я не могу решить эту проблему.
Ответ или решение
Вопрос, который вы описали, связан со split-операцией для разбиения полного имени на части: имя, среднее имя и фамилия в библиотеке Pandas. Давайте подробно разберем вашу проблему и предложим корректное решение, учитывающее исходный код, который у вас уже есть.
Проблема
Вы столкнулись с ошибкой AttributeError: 'list' object has no attribute 'mask'
, что указывает на то, что переменная middle
является не серией, а списком, и не поддерживает метод mask
. Таким образом, необходимо внести изменения в ваш код.
Решение
Ниже приведен исправленный код, который разбивает полное имя на составляющие и корректно обрабатывает средние имена:
import pandas as pd
# Загрузка данных из Excel файла
df = pd.read_excel(r"D:\SAMPLE EXCEL FILES\names.xlsx")
# Разделение строк в колонке 'Names' на списки
splitted = df['Names'].str.split()
# Извлечение первого, среднего и последнего имен
# Используем .str для получения серий
first = splitted.str[0] # Первое имя
last = splitted.str[-1] # Последняя часть как фамилия
# Для среднего имени используем .str[1:], чтобы получить все кроме первого и последнего
# Стратегия заключается в том, чтобы объединить все промежуточные имена, если они есть
middle = splitted.str[1:-1].str.join(' ')
middle = middle.where(middle.ne(''), '') # Заменяем пустые строки на пустую строку
# Добавление новых колонок в DataFrame
df['First Name'] = first
df['Middle Name'] = middle
df['Last Name'] = last
# Вывод итогового DataFrame
print(df)
Объяснение решения
-
Загрузка данных: Используем
pd.read_excel()
для загрузки данных из Excel файла. Не забудьте проверить, существует ли указанный путь. -
Разбиение имен: Создаем переменную
splitted
, которая содержит списки имен, разделенных пробелами, используяstr.split()
. -
Извлечение имен:
- Первое имя (
first
) извлекается с помощьюsplitted.str[0]
. - Последнюю часть (фамилию) можем получить с помощью
splitted.str[-1]
. - Для среднего имени используем
splitted.str[1:-1]
, что позволяет нам получить все значения между первым и последним именем. Затем объединяем их в одну строку с помощьюstr.join(' ')
.
- Первое имя (
-
Обработка пустых значений: Используя метод
where()
, мы заменяем пустые слоты на пустые строки. -
Добавление новых колонок: Новые колонки добавляются в DataFrame для представления имен в требуемом формате.
-
Вывод результата: Печатаем обновленный DataFrame для проверки полученного результата.
Следуя данному примеру, вы сможете избавиться от возникшей ошибки и корректно разбирать полные имена на составные части с использованием Pandas. Убедитесь также, что ваши данные в файле Excel корректны и заранее проверены на наличие лишних пробелов или неверных форматов.