【问题标题】:Python pandas str.extract from multiple columnsPython pandas str.extract 从多列
【发布时间】:2023-03-03 05:42:18
【问题描述】:

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

【问题讨论】:

    标签: python regex pandas extract multiple-columns


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案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 使用正则表达式可以提取多个模式,但这需要更复杂的正则表达式代码。我建议为此发布另一个问题。
      猜你喜欢
      • 1970-01-01
      • 2018-02-12
      • 2023-01-29
      • 2021-04-05
      • 2020-04-16
      • 1970-01-01
      • 2016-08-05
      • 2018-08-21
      • 2017-03-04
      相关资源
      最近更新 更多