Pandas & NumPy Academy · Урок

Объединение и очистка текстовых столбцов

Объединяйте несколько столбцов в одну строку, удаляйте лишние пробелы и нормализуйте несогласованные названия категорий.

Урок 4 из 413 шагов

«Объединение и очистка текстовых столбцов» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Объединение текстовых столбцов

Распространённая задача подготовки данных — создать одну строку, объединив значения из нескольких столбцов, например составить полное имя из имени и фамилии или адрес из улицы, города и страны. В Pandas текстовые столбцы объединяют оператором +, применённым к двум Series (или к Series и строковому литералу), предварительно преобразовав числовые столбцы в строки с помощью .astype(str).

import pandas as pd

df = pd.DataFrame({
    'first_name': ['Alice', 'Bob', 'Carol'],
    'last_name': ['Smith', 'Jones', 'White']
})

df['full_name'] = df['first_name'] + ' ' + df['last_name']
print(df['full_name'].tolist())
# ['Alice Smith', 'Bob Jones', 'Carol White']

Объединение со столбцами нестрокового типа

При объединении числового и строкового столбцов сначала необходимо преобразовать числовой столбец в строковый с помощью .astype(str). Оператор + в Python вызывает TypeError, если попытаться сложить строковый Series и целочисленный Series. Это распространённый источник путаницы при создании составных ключей или меток из столбцов разных типов.

import pandas as pd

df = pd.DataFrame({
    'product': ['Widget', 'Gadget'],
    'version': [3, 5]
})

# Must convert int to str before concatenating
df['label'] = df['product'] + ' v' + df['version'].astype(str)
print(df['label'].tolist())
# ['Widget v3', 'Gadget v5']

.str.cat() для объединения с разделителем

Series.str.cat(others, sep=) — встроенный в Pandas способ объединить несколько Series с разделителем, корректно обрабатывающий значения NaN. По умолчанию NaN в любом столбце приводит к тому, что результат для этой строки также становится NaN. Передайте na_rep='?' (или любую другую строку), чтобы заменить NaN заполнителем, а не распространять это значение дальше.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'city': ['NYC', 'LA', None],
    'state': ['NY', None, 'TX'],
    'country': ['USA', 'USA', 'USA']
})

# Join with ', ' — NaN rows produce NaN by default
df['location'] = df['city'].str.cat(
    [df['state'], df['country']],
    sep=', ',
    na_rep='N/A'
)
print(df['location'].tolist())
# ['NYC, NY, USA', 'LA, N/A, USA', 'N/A, TX, USA']

Нормализация несогласованных меток категорий

В реальных данных столбцы категорий часто содержат несогласованные метки, появившиеся из-за опечаток, различий в регистре или разных сокращений (например, 'US', 'USA', 'United States'). Стандартное решение — создать словарь соответствий, который сопоставляет каждый вариант канонической форме, а затем применить его с помощью .map() или .replace().

import pandas as pd

df = pd.DataFrame({
    'country': ['US', 'USA', 'United States', 'uk', 'UK', 'United Kingdom']
})

canonical = {
    'US': 'United States', 'USA': 'United States', 'United States': 'United States',
    'uk': 'United Kingdom', 'UK': 'United Kingdom', 'United Kingdom': 'United Kingdom'
}

df['country_clean'] = df['country'].map(canonical)
print(df['country_clean'].tolist())
# ['United States', 'United States', 'United States',
#  'United Kingdom', 'United Kingdom', 'United Kingdom']

Удаление пробелов и унификация регистра

Перед сравнением или группировкой текстовых столбцов всегда сначала удаляйте пробельные символы и нормализуйте регистр. Pandas считает два значения, которые кажутся человеку одинаковыми (' Active' и 'active'), разными из-за пробела в начале и различия в регистре. Цепочка из двух шагов — сначала strip, затем lower — устраняет обе проблемы.

import pandas as pd

df = pd.DataFrame({
    'status': ['  Active', 'INACTIVE', 'active ', ' Pending  ', 'ACTIVE']
})

df['status_clean'] = df['status'].str.strip().str.lower()
print(df['status_clean'].value_counts())
# active      3
# inactive    1
# pending     1

Нечёткое сопоставление для исправления опечаток

Если опечатки мешают точному сопоставлению, нечёткое сопоставление вычисляет показатели сходства между строками. Библиотека rapidfuzz (или классическая fuzzywuzzy) предоставляет векторизованное нечёткое сопоставление. Типичный рабочий процесс: для каждого уникального значения с ошибками найти ближайшее каноническое значение, превышающее порог сходства, и создать таблицу исправлений.

# Conceptual example (requires: pip install rapidfuzz)
from rapidfuzz import process

canonical_cities = ['New York', 'Los Angeles', 'Chicago', 'Houston']
dirty_values = ['New Yrok', 'Los Angelas', 'Chicagoo']

for dirty in dirty_values:
    best, score, _ = process.extractOne(dirty, canonical_cities)
    print(f'{dirty!r} -> {best!r} (score={score:.0f}%)')
# 'New Yrok'   -> 'New York'    (score=91%)
# 'Los Angelas'-> 'Los Angeles' (score=96%)
# 'Chicagoo'   -> 'Chicago'     (score=94%)

Разбиение ячеек с несколькими значениями с помощью explode()

Иногда ячейка содержит несколько значений, разделённых разделителем (например, 'python,sql,pandas'). Разделите столбец, чтобы получить списки, а затем вызовите .explode(), чтобы создать отдельную строку для каждого значения. Так упакованная широкая ячейка преобразуется в аккуратный длинный формат, где каждая строка содержит ровно одно значение. Это необходимо для операций группировки и объединения по этим значениям.

import pandas as pd

df = pd.DataFrame({
    'user_id': [1, 2, 3],
    'skills': ['python,sql', 'java,kotlin,sql', 'python']
})

df['skills'] = df['skills'].str.split(',')
exploded = df.explode('skills')
print(exploded)
#    user_id   skills
# 0        1   python
# 0        1      sql
# 1        2     java
# 1        2   kotlin
# 1        2      sql
# 2        3   python

Обработка текста с разными кодировками

Текстовые данные из разных источников могут содержать проблемы с кодировкой — необычные символы вроде \xa0 (неразрывный пробел), \u2019 (типографский апостроф) или искажённые символы с диакритическими знаками. Для быстрой очистки, оставляющей только ASCII, используйте .str.encode('ascii', errors='replace').str.decode('ascii'), а для разложения диакритических знаков перед их удалением — .str.normalize('NFKD').

import pandas as pd
import unicodedata

df = pd.DataFrame({'name': ['Caf\u00e9', 'na\u00efve', 'r\u00e9sum\u00e9']})

# Normalize and strip accents (NFKD decomposition + ascii encoding)
df['name_ascii'] = (
    df['name']
    .str.normalize('NFKD')
    .str.encode('ascii', errors='ignore')
    .str.decode('ascii')
)
print(df)
#       name name_ascii
# 0     Cafe       Cafe
# 1    naive      naive
# 2   resume     resume

Создание составных ключей

Во многих наборах данных необходимо создать составной ключ из нескольких столбцов, чтобы однозначно идентифицировать строку при объединении или удалении дубликатов. Объединение очищенных строковых столбцов (с удалёнными пробелами, приведённых к нижнему регистру и нормализованных) в одну строку-ключ обеспечивает согласованное сопоставление данных из разных источников, где одна и та же сущность может быть записана в каждом источнике немного по-разному.

import pandas as pd

df = pd.DataFrame({
    'first': ['  Alice', 'BOB', ' Carol'],
    'last': ['Smith ', 'JONES', 'White  '],
    'dob': ['1990-01-15', '1985-07-22', '1992-11-30']
})

df['match_key'] = (
    df['first'].str.strip().str.lower() + '|' +
    df['last'].str.strip().str.lower() + '|' +
    df['dob']
)
print(df['match_key'].tolist())
# ['alice|smith|1990-01-15', 'bob|jones|1985-07-22', 'carol|white|1992-11-30']

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

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

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'inactive', 'active', 'archived', 'unknown_status']
})

canonical = {'active', 'inactive', 'archived'}

unknown = df[~df['status'].isin(canonical)]['status'].unique()
print('Unknown statuses:', unknown.tolist())
# ['unknown_status']

# Flag unknown rows
df['status_valid'] = df['status'].isin(canonical)
print(df)

Полный конвейер очистки текста

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

import pandas as pd

def clean_category_column(series, canonical_map, canonical_set):
    cleaned = (
        series
        .str.strip()
        .str.lower()
        .map(lambda x: canonical_map.get(x, x))  # fix known variants
    )
    unknown = cleaned[~cleaned.isin(canonical_set)]
    if not unknown.empty:
        print('Warning: unknown values:', unknown.unique().tolist())
    return cleaned

cmap = {'eng': 'engineering', 'hr': 'human_resources', 'mktg': 'marketing'}
cset = {'engineering', 'human_resources', 'marketing', 'finance'}

df = pd.DataFrame({'dept': ['Eng', 'HR', 'Marketing', 'MKTG', 'Legal']})
df['dept_clean'] = clean_category_column(df['dept'], cmap, cset)
print(df)

Быстрая проверка

Проверьте, насколько хорошо Вы поняли объединение и очистку текстовых столбцов.

Повторение урока

В этом уроке Вы узнали, как объединять столбцы с помощью оператора + после преобразования чисел в строки, использовать str.cat(sep=) для объединения с разделителем и обработки NaN, применять каноническое отображение с помощью .map() для нормализации несогласованных меток и использовать explode() для преобразования ячеек со списками в строки. Используйте канонические наборы, чтобы на раннем этапе выявлять проблемы с качеством данных. Далее Вы узнаете о сортировке DataFrames по значениям столбцов.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Объединение и очистка текстовых столбцов» бесплатный?

Да — полный текст урока «Объединение и очистка текстовых столбцов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Объединение и очистка текстовых столбцов»?

Объединяйте несколько столбцов в одну строку, удаляйте лишние пробелы и нормализуйте несогласованные названия категорий. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Объединение и очистка текстовых столбцов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Аксессор .str
  2. Разделение и замена строк
  3. Сопоставление с шаблонами регулярных выражений
  4. Объединение и очистка текстовых столбцов
← Назад к Pandas & NumPy Academy