您当前的位置: 首页 > 技术文章 > 前端开发

42_Pandas字符串中提取正则表达式来生成新列

作者: 时间:2023-05-11阅读数:人阅读

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

加载中~
如果您对我们的成果表示认同并且觉得对你有所帮助可以给我们捐赠。您的帮助是对我们最大的支持和动力!
捐赠我们
扫码支持 扫码支持
扫码捐赠,你说多少就多少
2
5
10
20
50
自定义
您当前余额:元
支付宝
微信
余额

打开支付宝扫一扫,即可进行扫码捐赠哦

打开微信扫一扫,即可进行扫码捐赠哦

打开QQ钱包扫一扫,即可进行扫码捐赠哦