Py学习  »  Python

python pandas str.从多个列提取

nqcthanh • 6 年前 • 1585 次点击  

我正在尝试使用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'。因此,我希望result列返回这4位数字。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39836
文章 [ 2 ]  |  最新文章 6 年前
Erfan
Reply   •   1 楼
Erfan    6 年前

你快到了,你可以做以下事情。 我们可以用 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  
WeNYoBen
Reply   •   2 楼
WeNYoBen    6 年前

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