Python pandas str.extract из нескольких столбцов - PullRequest
2 голосов
/ 16 марта 2019

Я пытаюсь извлечь строковый шаблон из нескольких столбцов в один столбец результатов, используя 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 цифры.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы были почти там, вы можете сделать следующее.Мы можем использовать 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  
0 голосов
/ 16 марта 2019

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
...