2016-11-26 70 views
1

项目我有数据帧熊猫:每组过滤数据帧与条件匹配的至少一个

ID url session 
111 facebook.com 1 
111 vk.com 1 
111 stackoverflow.com 2 
222 wsj.com 3 
222 ria.ru 3 
222 twitter.com 4 
333 wikipedia.org 5 
333 rt.com 5 

我需要得到会话,如果有一个有效的URL

valid_urls = ['rt.com', 'wsj.com'] 

欲望输出

ID url session 
222 wsj.com 3 
222 ria.ru 3 
333 wikipedia.org 5 
333 rt.com 5 

我知道,我可以过滤使用df.url.str.contains,但我怎么能添加条件与session

回答

2

使用变换对每个环节都找到包含在列表中的一个有效的URL的操作,然后过滤掉数据框与得到的布尔系列:

df[df.groupby('session')['url'].transform(lambda x : x.isin(valid_urls).any())] 

    ID   url session 
3 222  wsj.com  3 
4 222   ria.ru  3 
6 333 wikipedia.org  5 
7 333   rt.com  5 
0

你可以试试这个:

df = df[(df['url'].str.contains('|'.join(valid_url))) & (df.session > 4)] 
+0

我想所有的会话,也有相关的URL从列表 –

+0

然后就去做打印(DF [“会话”])来获取会话哪里有有效的网址 –

0

试试这个:

df = df[df['url'].isin(valid_urls)] 

使用上述数据与您有效的URL列表(valid_urls = ['rt.com', 'wsj.com']),你可以期望的过滤DF是:

ID url session 
222 wsj.com 3 
333 rt.com 5 

如果需要在会话中添加第二个条件,则可以使用| (OR)或&(AND)操作如下:

df = df[(df['url'].isin(valid_urls)) & (df['session'] > 2)] 

这使您可以通过两个条件进行过滤,加入有或或者,正如你所需要的。

编辑:如果你需要生成valid_urls的列表,你可以做到这一步,首先:

from urlparse import urlparse 
valid_url = [] 
all_url = df['url'].tolist() 
for url in all_url: 
    parse_result = urlparse(url) 
    if parse_result.netloc != "": 
     valid_url.append(url) 

注意,此方法并不一定会检查URL是在浏览器中访问虽然。如果您需要验证您可能需要使用requests模块进行HTTP调用并查看响应代码是什么。

+0

但我的文件更大。我需要一个条件来获取所有网址,哪里有效的网址。 –

+0

@PetrPetrov所以在我看来,真正的问题是你需要定义一个有效的URL列表。你可以做的是通过使用'all_url = df ['url']。tolist()'来提取所有url的列表,然后循环并通过使用urlparse来验证每个url(参见:https://stackoverflow.com/questions/22238090 /验证的URL合蟒)。我会用一个例子更新我的答案。 –

0

我认为你可以使用isin - 首先为找到所有idssessions到新的DataFrame,称为same。最后merge与内部连接。如果需要检查子,使用str.contains

valid_urls = ['rt.com', 'wsj.com'] 
same = df.loc[df.url.isin(valid_urls), ['ID', 'session']] 
#same = df.loc[df.url.str.contains('|'.join(valid_urls)), ['ID', 'session']] 
print (same) 
    ID session 
3 222  3 
7 333  5 

print (pd.merge(df, same)) 
    ID   url session 
0 222  wsj.com  3 
1 222   ria.ru  3 
2 333 wikipedia.org  5 
3 333   rt.com  5