2016-11-26 105 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