Python 仅选择由括号包围的字符串的内容(数据框内的字符串)

Python 仅选择由括号包围的字符串的内容(数据框内的字符串),python,regex,pandas,Python,Regex,Pandas,我有一个熊猫数据框,看起来像 Run Time ... K Recovery Ca Recovery 0 14 05:02:54 ... 61,498.671 (492.0%) 62,095.863 (496.8%) 1 19 08:14:59 ... 63,576.997 (508.6%) 63,986.691 (511.9%) 2 35 10:30:42 ... 63,609.755 (508.9%) 64,

我有一个熊猫数据框,看起来像

  Run      Time  ...           K Recovery          Ca Recovery
0  14  05:02:54  ...  61,498.671 (492.0%)  62,095.863 (496.8%)
1  19  08:14:59  ...  63,576.997 (508.6%)  63,986.691 (511.9%)
2  35  10:30:42  ...  63,609.755 (508.9%)  64,400.180 (515.2%)
我希望它只保留百分比,并删除所有非数字的内容,使其看起来像这样:

  Run      Time  ...  K Recovery   Ca Recovery
0  14  05:02:54  ...  492.0        496.8
1  19  08:14:59  ...  508.6        511.9
2  35  10:30:42  ...  508.9        515.2
当我创建构成pandas数据库的列表时,我可以通过向每个字符串添加
re.findall(r'\(.*?\),CaRecovery)
函数来分离百分比,但是这给了我一些奇怪的格式问题:

  Run      Time Be Recovery  ... Al Recovery  K Recovery Ca Recovery
0  14  05:02:54   [(98.2%)]  ...  [(487.1%)]  [(492.0%)]  [(496.8%)]
1  19  08:14:59  [(101.6%)]  ...  [(499.8%)]  [(508.6%)]  [(511.9%)]
2  35  10:30:42  [(101.5%)]  ...  [(502.9%)]  [(508.9%)]  [(515.2%)]
它在括号周围加了方括号,现在出于某种原因

df = df.replace(r'[%]', '', regex=True)
对数据库没有影响

我需要的只是数字,这样我就可以将列转换为浮点数。

试试:

df.update(
    df.filter(regex=r"Recovery$").apply(
        lambda x: x.str.extract(r"\(([\d.-]+)%\)", expand=False)
    )
)
print(df)
印刷品:

运行时K恢复Ca恢复
0   14  05:02:54      492.0       496.8
1   19  08:14:59      508.6       511.9
2   35  10:30:42      508.9       515.2
试试:

印刷品:

运行时K恢复Ca恢复
0   14  05:02:54      492.0       496.8
1   19  08:14:59      508.6       511.9
2   35  10:30:42      508.9       515.2

使用分组并从返回的列表中提取响应:

import re

test_string = r"62,095.863 (496.8%)"

pattern = r"\(([^%]*)%?\)"  # without %
print(re.findall(pattern, test_string)[0])

pattern2 = r"\((.*)\)"  # with %
print(re.findall(pattern2, test_string)[0])

使用分组并从返回的列表中提取响应:

import re

test_string = r"62,095.863 (496.8%)"

pattern = r"\(([^%]*)%?\)"  # without %
print(re.findall(pattern, test_string)[0])

pattern2 = r"\((.*)\)"  # with %
print(re.findall(pattern2, test_string)[0])

您应该在正则表达式中添加分组括号,以消除括号字符。此外,如果在提取的结果周围加上括号,则处理结果一定不正确。方括号可能是字符串列表,因为
re.findall()
返回一个列表。您可能需要进一步为其下标以获取字符串,例如
result=re.findall(…
然后使用
result[0]
获取字符串。此外,由于字符串在列表中,因此无法获取df.replace工作。A将nice@anky是的,对不起,这是一个好主意,我将开始在我的未来包括这一点questions@JulianAvila很高兴你会考虑这个。干杯!!!你应该在正则表达式中添加分组括号给EL。对括号字符进行iminate。此外,如果在提取的结果周围使用括号,则处理结果肯定不正确。方括号可能是字符串列表,因为
re.findall()
返回一个列表。您可能需要进一步为其下标以获取字符串,例如
result=re.findall(…
然后使用
result[0]
获取字符串。此外,由于字符串在列表中,因此无法获取df.replace works。A将nice@anky是的,对不起,这是一个好主意,我将开始在我的未来包括这一点questions@JulianAvila高兴你会考虑这个。干杯!!!