【问题标题】:Pandas - using str.contains to match stringPandas - 使用 str.contains 匹配字符串
【发布时间】:2021-10-05 21:45:36
【问题描述】:

我的 pandas df 中有一个如下所示的列:

Cycle 1 (0 h)
           A
           B
           C
Cycle 2 (0 h 43 min)
           A
           B
           C

我正在尝试匹配“循环”并提取数字。理想情况下,我希望我的输出如下所示:

       0
       A
       B
       C
      0,43
       A
       B
       C

我试过了:

df['1'] = df['1'].str.contains('Cycle', regex=True).str.extract('(\d+)')

但它完全摆脱了 Cycle 行 - 我认为在提取数字后我可以使用 str.split() 并仅保留相关数字,然后我可以用逗号分隔这些数字。但我似乎无法提取数字。

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以使用

    rx = r'^Cycle\s+\d+\s+\((\d+)(?:\s*\w+\s*(\d+))?.*'
    df['1'] = df['1'].str.replace(rx, lambda x: f'{x.group(1)},{x.group(2)}' if x.group(2) else x.group(1), regex=True)
    

    请参阅regex demo。在这里,^Cycle\s+\d+\s+\((\d+)(?:\s*\w+\s*(\d+))?.* 模式被搜索,如果匹配,它被替换为 Group 1 + , + Group 2 的内容,或者根据 Group 2 是否匹配,只替换 Group 1 的值。

    详情

    • ^ - 字符串开头
    • Cycle - 一句话
    • \s+ - 一个或多个空格
    • \d+ - 一位或多位数字
    • \s+ - 一个或多个空格
    • \( - 一个 ( 字符
    • (\d+) - 第 1 组 (\1):一位或多位数字
    • (?:\s*\w+\s*(\d+))? - 一个可选的非捕获组,匹配一个可选的序列
      • \s*\w+\s* - 用一个或多个空格字符括起来的一个或多个单词字符
      • (\d+) - 第 2 组 (\2):一位或多位数字
    • .* - 字符串的其余部分。

    如果第 2 组匹配,则替换为第 1 组 + , + 第 2 组值,否则,只有第 1 组值。

    熊猫测试:

    import pandas as pd
    df = pd.DataFrame({'1': ['Cycle 1 (0 h)', 'Cycle 1 (0 h 48 min)']})
    rx = r'^Cycle\s+\d+\s+\((\d+)(?:\s*\w+\s*(\d+))?.*'
    df['1'].str.replace(rx, lambda x: f'{x.group(1)},{x.group(2)}' if x.group(2) else x.group(1), regex=True)
    # => 0       0
    # => 1    0,48
    # => Name: 1, dtype: object
    

    【讨论】:

    • 哇,正则表达式网站太酷了!感谢您的帮助。
    • @HenryEcker 已修复,我必须使用条件替换。
    猜你喜欢
    • 2023-03-24
    • 2017-08-09
    • 2018-10-10
    • 1970-01-01
    • 2016-06-09
    • 2017-12-12
    • 1970-01-01
    • 2017-07-15
    • 2019-06-27
    相关资源
    最近更新 更多