【问题标题】:Extracting digits after certain characters in pandas dataframe在熊猫数据框中的某些字符之后提取数字
【发布时间】:2020-02-08 09:01:12
【问题描述】:

我有一个数据框,其中一列包含'weak=30' 类型的字符串,我想提取= 字符串之后的数字并创建名为digits 的新列。

我使用re.search 来查找数字,但到目前为止它给出了一个错误。

示例数据

import pandas as pd
import re

raw_data = {'patient': [1, 2, 3,4, 6],
        'treatment': [0, 1, 0, 1, 0],
        'score': ['strong=42', 'weak=30', 'weak=12', 'pitt=12', 'strong=42']}

df = pd.DataFrame(raw_data, columns = ['patient', 'treatment', 'score'])

df

   patient  treatment      score
0        1          0  strong=42
1        2          1    weak=30
2        3          0    weak=12
3        4          1    pitt=12
4        6          0  strong=42

所以我尝试了

df=df.assign(digits=[int(re.search(r'\d+', x)) for x in df.score])

TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是 're.Match'

在 R 中你可以做到

mutate(digits=as.numeric(gsub(".*=","",score))

python pandas 中的等效函数是什么?

预期输出

   patient  treatment      score   digits
0        1          0  strong=42     42
1        2          1    weak=30     30
2        3          0    weak=12     12
3        4          1    pitt=12     12
4        6          0  strong=42     42

【问题讨论】:

  • df.join(df['score'].str.extract(r'=(?P<digits>\d+)$'))
  • @user3483203 感谢您的解决方案。您能否详细说明?P 代表什么?
  • 这是你如何设置捕获组返回的系列的名称。查找命名的正则表达式捕获组,pandas 只是使用该语法

标签: python regex pandas search extract


【解决方案1】:

您可以将str.replace 与您的 R 正则表达式一起使用:

df['digits'] = df['score'].str.replace(r'.*=', '').astype(int)

.*= 模式尽可能多地匹配除换行符之外的所有 0+ 字符,直到最后一个 =replaceing 与 '' 删除此文本。

或者,您可以使用提取字符串末尾= 之后的数字的方法:

df['digits'] = df['score'].str.extract(r'=(\d+)$', expand=False).astype(int)

这里,=(\d+)$ 匹配 =,然后将任何一位或多位数字捕获到第 1 组,然后断言字符串末尾的位置。

两种情况的输出都是:

>>> df
   patient  treatment      score  digits
0        1          0  strong=42      42
1        2          1    weak=30      30
2        3          0    weak=12      12
3        4          1    pitt=12      12
4        6          0  strong=42      42

【讨论】:

    【解决方案2】:

    re.search 返回一个 MatchObject 而不是直接匹配的字符串。 见https://docs.python.org/3.7/library/re.html#match-objects

    如果你想要字符串,你可以尝试以下方式:

    re.search(r'\d+', x).group(0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多