我有数据框
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
添加条件?
答案 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