str.extract()函数是pandas库中的一个非常有用的函数,也是一种正则表达式操作。它可以帮助我们从一个字符串中提取匹配特定正则表达式的子字符串,并将其转换到一个DataFrame或Series中。本文将从不同的方面详解它的使用方法和功能。
一、参数介绍
str.extract()函数共有4个参数:pat、flags、expand和regex。其中,pat和regex是必须的,它们是限定提取规则的正则表达式。flags和expand是可选的,flags用于传递修改正则表达式行为的参数,而expand则是一个布尔值,用于指示返回行为是DataFrame还是Series。
import pandas as pd data = {'raw': ['256 lbs', '155 lbs', '125 lbs']} df = pd.DataFrame(data) df['weight'] = df['raw'].str.extract('(\d+)', expand=True) print(df)
上述代码将一个DataFrame对象中的字符串列提取为数字型列”weight”。可以看到,我们首先定义了一个字典来生成一个DataFrame对象。接着,我们使用str.extract()函数,传入参数(\d+),它用于匹配一个或多个数字字符。在’expand=True’的条件下,该函数将保留提取列中与正则表达式模式匹配的字符串,并将其存储在名称为”weight”的新列中。
二、提取多个子字符串
str.extract()函数还可以同时提取多个符合规则的子字符串。在使用它时,只需要在提取规则中为每个待提取的组加上括号即可。
import pandas as pd data = {'raw': ['John Smith, CA', 'Jane Doe, NY', 'Sam Johnson, TX']} df = pd.DataFrame(data) df[['name', 'state']] = df['raw'].str.extract('([A-Za-z\s]+),\s([A-Za-z]+)', expand=True) print(df)
上述代码演示了如何从一个字符串列中同时提取人名和州名。我们首先定义一个DataFrame,然后使用str.extract()函数为正则表达式传递两个组,一个用于匹配人名、另一个用于匹配州名。在完成操作后,结果将存储在”df[[“name”, “state”]]”这个新DataFrame中,每个分量都由一个单独的子字符串组成。
三、使用命名组
当我们提取多个组时,为了避免后缀方式所带来的复杂性,我们可以使用命名组。使用命名组时,我们不再使用默认后缀方式,在返回值的列名中直接使用我们所定义的名称。
import pandas as pd data = {'raw': ['001-1234', '022-5678', '057-9012']} df = pd.DataFrame(data) df[['area', 'number']] = df['raw'].str.extract('(?P<area>\d{3})-(?P<number>\d{4})') print(df)
上述代码演示了如何使用命名组提取一个带有特定结构的字符串。“(?P<area><REGEX_EXPRESSION>)”语句用于定义一个名为”area”的组,该组是一个匹配三个数字字符的正则表达式。同样,语句“(?P<number><REGEX_EXPRESSION>)”用于定义一个名为”number”的组,该组使用了一个匹配四个数字字符的正则表达式。提取并将结果存储在新的DataFrame中的代码与前面类似。
四、自定义处理函数
在提取时,有时候需要通过一些额外的逻辑来处理或转换提取出来的结果。此时,我们可以将自定义的处理函数语句传递给”str.extract()”函数,并使其返回值成为新的提取列。
import pandas as pd data = {'raw': ['256 lbs', '155 lbs', '125 lbs']} df = pd.DataFrame(data) def kg_to_lbs(x): return int(x) * 2.20462 df['weight_lbs'] = df['raw'].str.extract('(\d+)', expand=True).apply(kg_to_lbs) print(df)
上述代码展示了如何使用自定义函数将从字符串列中提取出来的数字转换为重量单位lb。我们首先定义了一个字典数据,然后定义了一个自定义的方法”kg_to_lbs()”,该方法将基于获取的重量值将其从公斤转换成磅单位。接着,我们使用”apply()”函数将该方法映射到提取出来的值上,并将其存储在名称为”weight_lbs”的新列中。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/227422.html