Вопрос или проблема
Я экспортирую таблицу из базы данных в 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, извлекая нужные значения до и после символа «-».