Разделите полное имя на Имя, Отчество и Фамилию в Pandas

Вопрос или проблема

Я написал код для разделения полного имени на Имя, Среднее имя и Фамилию.

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)

Объяснение решения

  1. Загрузка данных: Используем pd.read_excel() для загрузки данных из Excel файла. Не забудьте проверить, существует ли указанный путь.

  2. Разбиение имен: Создаем переменную splitted, которая содержит списки имен, разделенных пробелами, используя str.split().

  3. Извлечение имен:

    • Первое имя (first) извлекается с помощью splitted.str[0].
    • Последнюю часть (фамилию) можем получить с помощью splitted.str[-1].
    • Для среднего имени используем splitted.str[1:-1], что позволяет нам получить все значения между первым и последним именем. Затем объединяем их в одну строку с помощью str.join(' ').
  4. Обработка пустых значений: Используя метод where(), мы заменяем пустые слоты на пустые строки.

  5. Добавление новых колонок: Новые колонки добавляются в DataFrame для представления имен в требуемом формате.

  6. Вывод результата: Печатаем обновленный DataFrame для проверки полученного результата.

Следуя данному примеру, вы сможете избавиться от возникшей ошибки и корректно разбирать полные имена на составные части с использованием Pandas. Убедитесь также, что ваши данные в файле Excel корректны и заранее проверены на наличие лишних пробелов или неверных форматов.

Оцените материал
Добавить комментарий

Капча загружается...