2017-10-20 48 views
0

我有一個任務:熊貓:提高代碼

數據看起來像

id  event_path event_time event_duration 
111  vk.com   12-12-2016  15 
111 mvideo.ru/phones 12-12-2016  29 

我需要的字符串,其中域是mvideo.ru之前得到5前一個唯一域。

我使用的代碼

def get_domain(df, list_url, list): 
    for i, url in enumerate(list_url): 
     get_domain = tldextract.extract(url) 
     subdomain = get_domain[1] + '.' + get_domain[2] 
     if subdomain.startswith('.'): 
      subdomain = subdomain[1:] 
     elif subdomain.endswith('.'): 
      subdomain = subdomain[:-1] 
     elif subdomain.startswith('www.'): 
      subdomain = subdomain[4:] 
     list.append(subdomain) 
    df['domain'] = list 
    return df 

    result = pd.DataFrame() 

for i, chunk in enumerate(df): 
    chunk = get_domain(chunk, chunk.event_path.values.tolist(), []) 
    g = (chunk.domain != chunk.domain.shift()).cumsum() 
    chunk = (chunk.groupby([chunk.member_id, g], sort=False).agg({'domain': 'first'}) 
     .reset_index(level='domain', drop=True) 
     .reset_index() 
     .reindex(columns=chunk.columns)) 
    cols = ['member_id', 'domain'] 
    chunk = chunk[cols] 
    relevant = chunk[chunk.domain.isin(['utkonos.ru', 'mvideo.ru'])] 
    for i in relevant.index.values: 
     previous_5 = chunk.iloc[i-5:i, :] 
     previous_5 = previous_5.groupby('member_id')['domain'].apply(list) 
     result = result.append(previous_5) 

我認爲這不是一個完美的代碼,它需要大量的時間。 我該如何改進它?我應該使用什麼或應該學習和閱讀什麼?

+3

不能再添加幾行數據和預期輸出 – Dark

+1

如何處理一些_more_數據以及一些預期的輸出。 –

回答

0

IIUC:

domains = pd.Series(df['event_path'].str.split('/', expand=False).str[0].unique()) 

first = domains.str.startswith('mvideo.ru').idxmax() 

domains.iloc[max(0, first-5) : first] 

Series.unique()文檔字符串PS:

返回在對象固有值。唯一身份證號碼爲,按照 的順序返回,這並不排序。基於哈希表的獨特。