#python #regex #pandas #extract #multiple-columns
#python #регулярное выражение #pandas #извлечение #несколько столбцов
Вопрос:
Я пытаюсь извлечь шаблон строки из нескольких столбцов в один столбец результатов, используя Pandas и str.extract.
Мой пример фрейма данных выглядит следующим образом.
field1 field2
ab1234 ab1234
ac1234
qw45 rt23
c1234b cb1234
cv 1234dd
...
Я хочу извлечь ‘1234’ (РЕДАКТИРОВАТЬ: любое 4-значное целое число, а не только ‘1234’) из любого столбца (в данном случае field1 и field2) в новый столбец результатов, чтобы получить желаемый результат ниже
field1 field2 result
ab1234 ab1234 1234
ac1234 1234
qw45 rt23
c1234b cb1234 1234
cv 1234dd 1234
...
Я пытаюсь использовать pandas str.extract для получения желаемого результата, однако у меня не получилось следующим образом.
import pandas as pd
import numpy as np
import re
df = pd.DataFrame({'field1':['ab1234','ac1234','qw45', 'c1234b', 'cv'],
'field2':['ab1234','','rt23','cb1234', '1234dd']})
df['result'] = df[['field1', 'field2']].apply(lambda x:
x.str.extract(r'(d{4})', flags = re.IGNORECASE, expand =
False)).any(axis=1)
print(df)
Приведенное выше возвращает только логические результаты. Мне интересно, можно ли преобразовать приведенное выше, чтобы вернуть фактический шаблон, или есть другие способы решения этой проблемы?
Заранее большое вам спасибо.
РЕДАКТИРОВАТЬ: Извините, я должен упомянуть, что шаблоном может быть любое 4-значное целое число, а не только ‘1234’. Таким образом, я хочу, чтобы результирующий столбец возвращал эти 4 цифры.
Ответ №1:
IIUC
df['New']=df.apply(','.join,axis=1).str.extract(r'(d{4})', expand =
False).fillna('')
df
field1 field2 New
0 ab1234 ab1234 1234
1 ac1234 1234
2 qw45 rt23
3 c1234b cb1234 1234
4 cv 1234dd 1234
Ответ №2:
Вы были почти на месте, вы можете сделать следующее. Мы можем использовать for loop
для применения str.extract
дважды, чтобы создать два временных столбца.
После этого создайте последний столбец result
с fillna
помощью.
cols = ['field1', 'field2']
n=1
for col in cols:
df['result' str(n)] = df[col].str.extract('([0-9]{4})')
n = 1
df['result'] = df.result1.fillna(df.result2).fillna('')
df.drop(['result1', 'result2'], inplace=True, axis=1)
print(df)
field1 field2 result
0 ab1234 ab1234 1234
1 ac1234 1234
2 qw45 rt23
3 c1234b cb1234 1234
4 cv 1234dd 1234
Комментарии:
1. Большое спасибо, Эрфан, это отлично работает, никогда не думал использовать. заполнено. Просто интересно, будете ли вы по-прежнему рекомендовать использовать . нужно ли заполнять более сложные условия, такие как более 2 полей для извлечения или применения нескольких шаблонов? Еще раз спасибо, Эрфан.
2. @nqcthanh с помощью regex вы можете извлекать несколько шаблонов, но для этого потребуется более сложный код регулярного выражения. Я бы предложил опубликовать другой вопрос по этому поводу.