2017-02-25 18 views
-2

我有字符串的列表如下:掉落行通过匹配子串列表

drop_list = [ "www.stackoverflow", "www.youtube."] 

我有一个熊猫数据帧df用柱,用名column_name1说,其可能或可能不包含drop_list中的子字符串。样品DF如下:

columnname1 
------------ 
https://stackoverflow.com/python-pandas-drop-rows-string-match-from-list 
https://stackoverflow.com/deleting-dataframe-row-in-pandas-column-value 
https://textblob.readthedocs.io/en/dev/quickstart.html#create-a-textblob 
https://textblob.readthedocs.io/en/dev/ 
https://textblob.readthedocs.io/en/stackoverflow 
https://textblob.readthedocs.io/en/youtube 
https://www.youtube.com/watch?v=sHkjdkjsk 
https://www.youtube.com/watch?v=_jksjdkjklI 
https://www.youtube.com/watch?v=jkjskjkjkjkw 

所以,我想从DF,其中包含从drop_list子串删除所有行。

如果我理解正确,如果drop_list是我想要匹配的确切值,那么我可以根据此SO问题使用以下代码。

df[~df['column_name1'].isin(to_drop)] 

或者使用str.contains方法在this回答表明,如果它只是一个价值

df[~df['column_name1'].str.contains("XYZ")] 

现在,如何既与方法相结合,删除列?所需的输出将丢弃包含计算器或从我的数据帧的YouTube任何行:

columnname1 
------------ 
https://textblob.readthedocs.io/en/dev/quickstart.html#create-a-textblob 
https://textblob.readthedocs.io/en/dev/ 
https://textblob.readthedocs.io/en/stackoverflow 
https://textblob.readthedocs.io/en/youtube 

如果我按原样运行df = df[~df['col1'].str.contains('|'.join(to_drop))]to_drop,它保留了stackoverflow网址,但删除了youtube网址。

如果我改变我的列表更通用如下 to_drop =“计算器”,“YouTube”的视频]

它删除

https://textblob.readthedocs.io/en/stackoverflow 
https://textblob.readthedocs.io/en/youtube 

因此,所有我试图做的是删除所有包含stackoverflow和youtube网址的行。我正在避免使用urlparse库!

Here是MWE。

+1

请提供的样品数据集和所希望的数据集 – MaxU

+1

'.str.contains('| '.join(to_drop))'可以用来检查'to_drop'中的所有元素,但我不确定这是不是你问的。我认为样本也会很好。 – ayhan

+0

新增样本数据集。 '''.str.contains('|'.join(to_drop))'''解决不了我相信。 – kingmakerking

回答

0

尝试这种情况:

import re 

drp = [re.sub(r'www\.|\.$|\.com', '', x) for x in to_drop] 
df[~df.col1.str.extract(r'http[s]*://([^/]*).*', expand=False) 
    .str.contains('|'.join(drp))] 

收率:

                 col1 
2 https://textblob.readthedocs.io/en/dev/quickstart.html#create-a-textblob 
3         https://textblob.readthedocs.io/en/dev/ 
4       https://textblob.readthedocs.io/en/stackoverflow 
5        https://textblob.readthedocs.io/en/youtube 

说明:

In [38]: drp 
Out[38]: ['stackoverflow', 'youtube'] 

In [41]: df.col1.str.extract(r'http[s]*://([^/]*).*', expand=False) 
Out[41]: 
0   stackoverflow.com 
1   stackoverflow.com 
2 textblob.readthedocs.io 
3 textblob.readthedocs.io 
4 textblob.readthedocs.io 
5 textblob.readthedocs.io 
6   www.youtube.com 
7   www.youtube.com 
8   www.youtube.com 
Name: col1, dtype: object 

In [42]: df.col1.str.extract(r'http[s]*://([^/]*).*', expand=False).str.contains('|'.join(drp)) 
Out[42]: 
0  True 
1  True 
2 False 
3 False 
4 False 
5 False 
6  True 
7  True 
8  True 
Name: col1, dtype: bool