我如何去删除一个空字符串或至少有正则表达式忽略它?
我有一些像这样的数据
EIV (5.11 gCO₂/t·nm)
我只想提取数字。我做了以下的事情:
df['new column'] = df['column containing that value'].str.extract(r'((d+.d*)|(d+)|(.d+)|(d+[eE][+]?d*)?)').astype('float')
因为数字可以是浮点数,整数,我想有一个指数4E+1
然而,当我运行它时,我得到的错误标题,我假定是一个空字符串。
我在这里错过了什么让代码运行?
试试这个
import re
c = "EIV (5.11 gCO₂/t·nm)"
x = re.findall("[0-9]*.?[0-9]+(?:[eE][-+]?[0-9]+)?", c)
print(x)
会给
['5.11']
问题不仅在于组的数量,而且在于regex中的最后一个选项是可选的(参见后面添加的?
,以及您的regex演示)。但是,由于Series.str.extract
返回第一个匹配,如果匹配不在字符串的开始位置,则regex匹配并返回字符串开头的空字符串。
最好使用众所周知的单个可选模式来匹配任何数字与单个捕获组,例如
df['col'].str.extract(r'((?:(?:b[0-9]+)?.)?b[0-9]+(?:[eE][-+]?[0-9]+)?)b').astype(float)
参见匹配通用编程语言结构的正则表达式示例。
熊猫测试:
import pandas as pd
df = pd.DataFrame({'col':['EIV (5.11 gCO₂/t·nm)', 'EIV (5.11E+12 gCO₂/t·nm)']})
df['col'].str.extract(r'((?:(?:b[0-9]+)?.)?b[0-9]+(?:[eE][-+]?[0-9]+)?)b').astype(float)
# => 0
# 0 5.110000e+00
# 1 5.110000e+12
也有相当多的其他类似的regex变体解析科学符号?,也可以使用r"([-+]?[0-9]*.?[0-9]+(?:[eE][-+]?[0-9]+)?)"
、r"(-?d+(?:.d*)?(?:[eE][+-]?d+)?)"
、r"([+-]?(?:0|[1-9]d*)(?:.d+)?(?:[eE][+-]?d+)?)"
等。
如果您的专栏包含相同格式的数据(如您发布的- EIV (5.11 gCO₂/t·nm)),那么它肯定会起作用
import pandas as pd
df['new_exctracted_column'] = df['column containing that value'].str.extract('(d+(?:.d+)?)')
df
5.11