Формат маски Dataframe Python для очистки свободного формата данных до и после специального символа ‘-‘

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

Я экспортирую таблицу из базы данных в pandas dataframe и пытаюсь применить маску формата для очистки некоторого текста свободного формата, содержащегося в одном из столбцов.

Я хочу создать новый столбец в dataframe, чтобы извлечь все числа непосредственно перед и после ‘-‘ из существующего столбца. Обратите внимание, что они разделены любым пробелом, как показано в последнем примере.

Вот некоторые из вариантов данных, которые у меня есть:

'Widget 1234-12345 Blah Blah',
'12345-12345_A',
'123456-123456 и 6789-12345'
'12 1234567-1234567'

Вывод должен выглядеть так:

1234-12345
12345-12345
123456-123456
1234567-1234567

Используйте Series.str.extract:

df['col'] = df['col'].str.extract(r'(\d+-\d+)', expand=False)
print (df)
               col
0       1234-12345
1      12345-12345
2    123456-123456
3  1234567-1234567

Для всех совпадений можно использовать Series.str.findall:

df['col'] = df['col'].str.findall(r'(\d+-\d+)').str.join(', ')
print (df)
                         col
0                 1234-12345
1                12345-12345
2  123456-123456, 6789-12345
3            1234567-1234567

Ответ или решение

Для решения вашей задачи по очистке свободного текста в столбце DataFrame с использованием pandas, вы можете использовать методы Series.str.extract и Series.str.findall. Мы будем извлекать и форматировать данные на основе вашего шаблона, где предполагается, что числа находятся перед и после символа «-».

Ниже приведен пример кода, который делает именно это:

import pandas as pd

# Создание DataFrame с данными
data = {
    'col': [
        'Widget 1234-12345 Blah Blah',
        '12345-12345_A',
        '123456-123456 and 6789-12345',
        '12 1234567-1234567'
    ]
}

df = pd.DataFrame(data)

# Использование str.extract для извлечения первого совпадения формата "число-число"
df['cleaned_col'] = df['col'].str.extract(r'(\d+-\d+)', expand=False)

# Для получения всех совпадений используем str.findall и str.join
# df['cleaned_col'] = df['col'].str.findall(r'(\d+-\d+)').str.join(', ')

# Выводим DataFrame
print(df)

Вывод программы будет следующим:

                                     col          cleaned_col
0            Widget 1234-12345 Blah Blah           1234-12345
1                              12345-12345             12345-12345
2                123456-123456 and 6789-12345   123456-123456
3                       12 1234567-1234567           1234567-1234567

Если вам нужно извлечь все совпадения в строке, закомментированная часть кода выше с использованием str.findall будет для вас полезна:

df['cleaned_col'] = df['col'].str.findall(r'(\d+-\d+)').str.join(', ')

В этом случае, если в строке будет несколько пар «число-число», они будут объединены в одну строку через запятую.

Таким образом, вы можете использовать этот код для обработки ваших данных в pandas DataFrame, извлекая нужные значения до и после символа «-».

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

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