Pandas:过滤每组的数据帧,条件匹配组中的至少一个项目

时间:2016-11-26 10:02:01

标签: python pandas

我有数据框

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

如果有有效的网址,我需要进行会话

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添加条件?

4 个答案:

答案 0 :(得分:2)

对每个会话使用transform来查找包含列表中一个有效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

答案 1 :(得分:0)

你可以试试这个:

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

答案 2 :(得分:0)

试试这个:

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

使用上面的数据和您的有效网址列表(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)]

这允许您按两个条件进行过滤,根据需要使用OR或AND连接。

编辑:如果您需要生成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调用并查看响应代码是什么。

答案 3 :(得分:0)

我认为您可以使用isin - 首先查找所有ids,将sessions添加到名为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