42_Pandas字符串中提取正则表达式来生成新列
42_Pandas字符串中提取正则表达式来生成新列
如何通过从以字符串为元素的pandas.DataFrame列和pandas.Series中提取带有正则表达式的特定字符串来生成新列。
使用以下字符串方法。
- str.extract():仅提取第一个匹配项
- str.extractall():提取所有匹配项
如果要从pandas.DataFrame的列中提取,可以指定列(= pandas.Series),例如df [‘column name’],然后调用str.extract()或str.extractall()确定。
str.extract():仅提取第一个匹配项
以下pandas.Series为例。
import pandas as pd
s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.net', 'ccc@zzz.co.jp'], index=['A', 'B', 'C'])
print(s_org)
# A aaa@xxx.com
# B bbb@yyy.net
# C ccc@zzz.co.jp
# dtype: object
使用str.extract()方法仅提取正则表达式的第一个匹配项。
如果在str.extract()的第一个参数中指定了正则表达式模式,则将提取与()中包含的组部分匹配的字符串。
如果参数expand为True,则创建一个新对象为pandas.DataFrame,如果参数为False,则将创建一个新对象为pandas.Series。
df_single = s_org.str.extract('(.+)@', expand=True)
print(df_single)
print(type(df_single))
# 0
# A aaa
# B bbb
# C ccc
# <class 'pandas.core.frame.DataFrame'>
s = s_org.str.extract('(.+)@', expand=False)
print(s)
print(type(s))
# A aaa
# B bbb
# C ccc
# dtype: object
# <class 'pandas.core.series.Series'>
在0.22.0版中,expand = False是默认设置,但将来,expand = True将是默认设置。由于结果将根据版本而变化,因此可以安全地显式指定扩展。
FutureWarning: currently extract(expand=None) means expand=False (return Index/Series/DataFrame)
but in a future version of pandas this will be changed to expand=True (return DataFrame)
如果对正则表达式模式使用命名组(?P …),则该名称将按原样变为列名(列名)。
df_name = s_org.str.extract('(?P<local>.+)@', expand=True)
print(df_name)
print(type(df_name))
# local
# A aaa
# B bbb
# C ccc
# <class 'pandas.core.frame.DataFrame'>
如果()中包含多个组,则将返回pandas.DataFrame,其中每个组提取的部分为列。在这种情况下,无论pandas.DataFrame参数是否为True或False。 默认情况下,以0开头的序列号是列名,如果使用命名组(?P …),则为列名。
print(s_org.str.extract('(.+)@(.+)'))
# 0 1
# A aaa xxx.com
# B bbb yyy.net
# C ccc zzz.co.jp
print(s_org.str.extract('(?P<local>.+)@(?P<domain>.+)'))
# local domain
# A aaa xxx.com
# B bbb yyy.net
# C ccc zzz.co.jp
如果没有匹配的部分,则为NaN。
print(s_org.str.extract('(a+)', expand=True))
# 0
# A aaa
# B NaN
# C NaN
str.extractall():提取所有匹配项
以下pandas.Series为例。
s_org2 = pd.Series(['aaa@xxx.com, iii@xxx.com', 'bbb@yyy.net, jjj@yyy.net', 'ccc@zzz.co.jp'],
index=['A', 'B', 'C'])
print(s_org2)
# A aaa@xxx.com, iii@xxx.com
# B bbb@yyy.net, jjj@yyy.net
# C ccc@zzz.co.jp
# dtype: object
由于str.extract()仅返回第一个匹配部分,因此结果如下。
print(s_org2.str.extract('([a-z]+)@([a-z.]+)', expand=True))
# 0 1
# A aaa xxx.com
# B bbb yyy.net
# C ccc zzz.co.jp
使用str.extractall()方法提取所有匹配项。
str.extractall()的结果如下。 str.extractall()没有扩展参数,并且始终返回具有多索引索引的pandas.DataFrame。
df_all = s_org2.str.extractall('([a-z]+)@([a-z.]+)')
print(df_all)
# 0 1
# match
# A 0 aaa xxx.com
# 1 iii xxx.com
# B 0 bbb yyy.net
# 1 jjj yyy.net
# C 0 ccc zzz.co.jp
print(df_all.index)
# MultiIndex(levels=[['A', 'B', 'C'], [0, 1]],
# labels=[[0, 0, 1, 1, 2], [0, 1, 0, 1, 0]],
# names=[None, 'match'])
请参阅以下文章,以指定和选择多索引pandas.DataFrame的元素。
请注意,即使只有一个匹配的部分,索引也将是多索引。我正在使用str.extract()示例中使用的Series。
print(s_org.str.extractall('([a-z]+)@([a-z.]+)'))
# 0 1
# match
# A 0 aaa xxx.com
# B 0 bbb yyy.net
# C 0 ccc zzz.co.jp
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:licqi@yunshuaiweb.com
上一篇:JS——正则表达式(超详细)
下一篇:JavaScript正则验证