Python pandas str.извлечение из нескольких столбцов

#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 вы можете извлекать несколько шаблонов, но для этого потребуется более сложный код регулярного выражения. Я бы предложил опубликовать другой вопрос по этому поводу.