从多个列中提取Python Pandas str。

时间:2019-03-15 22:50:53

标签: python regex pandas extract multiple-columns

我正在尝试使用Pandas和str.extract将多列字符串模式提取到单个结果列中。

我的示例数据框如下。

field1   field2
ab1234   ab1234
ac1234   
qw45     rt23
c1234b   cb1234
cv       1234dd
...

我想从任一列(在这种情况下为field1和field2)中提取“ 1234”(编辑:任意4位整数,而不仅仅是“ 1234”)到新的结果列中,以在下面获得所需的结果

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 个答案:

答案 0 :(得分:1)

您快到了,可以执行以下操作。 我们可以使用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 :(得分:0)

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