在Pandas数据帧上使用Regex的新列的多个条件

时间:2017-11-24 21:33:11

标签: python regex pandas numpy dataframe

所以,我在Pandas中有一个类似下面的df:

Name        URL
X           http://www.x.com/abc/xyz/url.html
X           http://www.x.com/yyz/hue/end.html
Othername   http://website.othername.com/abc.html
Othername   http://home.othername.com/someword/word.html
Example     http://www.example.com/999/something/index.html

我想,使用正则表达式(我猜)添加一个" Extract"专栏,如下:

Name        URL                                              Extract
X           http://www.x.com/abc/xyz/url.html                abc
X           http://www.x.com/yyz/hue/end.html                yyz 
Othername   http://website.othername.com/abc.html            website
Othername   http://home.othername.com/someword/word.html     home
Example     http://www.example.com/999/something/index.html  999

如您所见,我想要提取的部分因网站而异。所以,对于价值' X'在' Name'下,我必须应用一个正则表达式模式。对于' Othername',另一种模式。

我有6种不同的(和6种不同的模式)。

我尝试使用' where',但我可以让它仅适用于其中一个网站,而不是考虑多个条件。如下:

df['Extract'] = np.where(df['Name'] == 'X', df.URL.str.extract(r'www\.x\.com\/(.*?)/'),'')

我也试过为此创建一个函数:

def ext(c):
    if c['Name'] == 'X':
        c.URL.str.extract(r'www\.x\.com\/(.*?)/')
    elif c['Name'] == 'Example':
        c.URL.str.extract(r'www\.example\.com\/(.*?)/')
    (...)
    else:
        return ''

df['Extract'] = df.apply(ext)
df

如何根据'姓名'

的不同方式进行此项工作?

2 个答案:

答案 0 :(得分:1)

试试这个:

In [87]: df['Extract'] = (df.URL.replace([r'http[s]?://www\.[^/]*\/', r'http[s]?://'], ['',''], regex=True)
    ...:                    .str.extract(r'([^/.]*)', expand=False))
    ...:

In [88]: df
Out[88]:
        Name                                              URL  Extract
0          X                http://www.x.com/abc/xyz/url.html      abc
1          X                http://www.x.com/yyz/hue/end.html      yyz
2  Othername            http://website.othername.com/abc.html  website
3  Othername     http://home.othername.com/someword/word.html     home
4    Example  http://www.example.com/999/something/index.html      999

答案 1 :(得分:0)

您可以使用条件正则表达式:

import re
rx = re.compile(r'https?://(www)?(?(1)[^/+]+/([^/]+)|([^.]+))')
def extract(col):
    m = rx.match(col)
    if m is not None:
        return m.group(3) if m.group(3) is not None else m.group(2)
    else:
        return ''

df['Extract'] = df['URL'].apply(extract)

这假设您在/后查找子域名为www的子域名本身时的第一部分。

<小时/> 细分说明:

https?://   # match http:// or https.//
(www)?      # capture www into group 1 if it is there
(?(1)       # check if it was matched
    [^/+]+/ # ... and if so fast forward ...
    ([^/]+) # capture it into group 2
|           # else
    ([^.]+) # otherwise capture the part directly after http://
)           # into group 3

请参阅a demo on regex101.com