我正在尝试使用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位数字。
答案 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