2017-10-20 11 views
0

私は仕事を持っている:私は、ドメインがmvideo.ruある文字列、前5以前のユニークなドメインを取得する必要があり パンダ:向上コード

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

よう

データが見えます。

私はコード

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:オブジェクト内の

戻り一意の値。ユニークはの順で返され、 の順で返されます。これはをソートしません。ユニークなハッシュテーブルベース。

関連する問題