【问题标题】:Extracting string between multiple occurrence of same delimiter in python pandas在python pandas中多次出现相同分隔符之间提取字符串
【发布时间】:2021-08-11 15:07:12
【问题描述】:

“Test”列包含多次出现相同分隔符的字符串。我正在尝试获取这些分隔符内的字符串。你能帮忙吗?

示例:

Test
|||||CHNBAD||POC-RM0EP7-01-A

我的代码:

df["Fetch"]=df["Test"].str.rsplit("|", 2).str[-2]

但它给了我一个输出为POC-RM0EP7-01-A

我希望从字符串中获取“CHNBAD

【问题讨论】:

  • 让我们知道是否需要对答案进行任何澄清。看看下面的任何答案是否满足您的需求。

标签: python pandas substring


【解决方案1】:

使用您展示的示例,请尝试以下操作。我们可以在这里使用str.extract function pf Pandas。在Test 列上应用str.extract 函数并在DataFrame 中创建名为Fetch 的新列。

df['Fetch'] = df['Test'].str.extract(r'^\|+([^|]*)\|.*',expand=False)

DataFrame 如下:

    Test                            Fetch
0   |||||CHNBAD||POC-RM0EP7-01-A    CHNBAD

正则表达式的解释:

^\|+     ##Matching 1 or more matches of | from starting of value.
([^|]*)  ##Creating 1st capturing group which has everything till next | comes.
\|.*     ##Matching | and everything till last of value.

【讨论】:

  • 您好,我尝试使用 '\|.*' 提取所有内容,直到最后一个值,但我的“所有内容”是一个带有 \n 的字符串,例如“|AAA\neee\n " 和 '\|.*' 在第一个 \n 处停止。任何解决方案的想法?谢谢!
【解决方案2】:

我认为regex 是解决方案:

import re

def clean_text(text):
    match = re.search(r'[|]+([A-Z]+)[|]+', text)
    if match:
        return match.group(1)
    else:
        print(f'WARNING: {text} does not follow the pattern')
        return ''

df["Fetch"]=df["Test"].apply(clean_text)

正则表达式解释:[|]+ 使用所有管道字符,然后是一组大写 A-Z 字符 ([A-Z])+,最后确保存在一些(至少一个)管道与 [|]+

但是,如果您遇到更大的问题,这可能是一个不好的解决方法,也许您可​​以提供更多详细信息来说明您是如何解决这种情况的。

【讨论】:

    【解决方案3】:

    (1)如果只需要提取此类字符串的第一次出现:

    你可以使用.str.extract(),如下:

    df['Fetch'] = df['Test'].str.extract(r'\|([^|]+)\|')
    

    Regex \|([^|]+)\| 是您可以使用的最简单的形式:

    \| 匹配目标字符串前的分隔符|

    ( 捕获组的左括号

    [^|] 除定界符 | 以外的任何字符的字符类

    + 一次或多次出现的量词

    ) 捕获组的左括号

    \| 匹配目标字符串后的分隔符|

    结果:

    为更多测试用例增加了 2 行

    print(df)
    
                                Test   Fetch
    0   |||||CHNBAD||POC-RM0EP7-01-A  CHNBAD
    1  |||||CHNBAD||POC-RM0EP7-01-A|  CHNBAD
    2           ||ABC||DEF|GHI|||JKL     ABC
    

    (2) 如果要提取所有出现的此类字符串

    你可以使用.str.extractall(),如下:

    df = df[['Test']].join(df['Test'].str.extractall(r'(?<=\|)([^|]+)(?=\|)').unstack().droplevel(0, axis=1).rename(lambda x: 'Fetch_' + str(x+1), axis=1))
    

    结果:

    print(df)
    
                                Test Fetch_1          Fetch_2 Fetch_3
    0   |||||CHNBAD||POC-RM0EP7-01-A  CHNBAD              NaN     NaN
    1  |||||CHNBAD||POC-RM0EP7-01-A|  CHNBAD  POC-RM0EP7-01-A     NaN
    2           ||ABC||DEF|GHI|||JKL     ABC              DEF     GHI
    

    在这里,我们需要一个更复杂的正则表达式,以便从最后一行中提取 3 个匹配项。如果我们使用之前的正则表达式,只会提取 2 个匹配项。

    如果您想要更多关于正则表达式和代码的解释,我可以稍后根据您的要求进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      相关资源
      最近更新 更多