Python pandas str.extract 从多列

Posted

技术标签:

【中文标题】Python pandas str.extract 从多列【英文标题】:Python pandas str.extract from multiple columns 【发布时间】:2019-08-07 01:34:15 【问题描述】:

我正在尝试使用 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'(\d4)', 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'(\d4)', 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 来创建两个临时列。

然后用fillna 创建最后一列result

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  

【讨论】:

非常感谢二凡,这很好用,从没想过使用.fillna。只是想知道,如果您仍然建议将 .fillna 用于更复杂的条件,例如超过 2 个字段来提取或应用多个模式?再次感谢二凡。 @nqcthanh 使用正则表达式可以提取多个模式,但这需要更复杂的正则表达式代码。我建议为此发布另一个问题。

以上是关于Python pandas str.extract 从多列的主要内容,如果未能解决你的问题,请参考以下文章

str.extract 在 pandas DataFrame 中从后面开始

pandas - series.str.extract 正在删除捕获组的第一个字符

如何为 Pandas RE .str.extract() 使用 RE OR Operand

pandas的分列之不规则字符串及str.extract()

使用 df['var'].str.extract() (Python) 查找多个单词?

23、pandas的多列拼接成一列函数.str.cat()