熊猫:改善鳕鱼

2022-12-01 04:18:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个任务:

数据看起来像

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

我需要在字符串之前获得5个以前的唯一域,其中域是mvideo.ru

我使用代码

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)

我认为这不是一个完美的代码,它需要很多时间。 我怎样才能改进它?我应该使用什么,或者我应该学习和阅读什么


Tags: subdomainineventidurldfforgetdomainruresultlistchunkpreviousmvideo
1条回答
网友
1楼 · 发布于 2022-12-01 04:18:30

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()docstring的PS:

Return unique values in the object. Uniques are returned in order of appearance, this does NOT sort. Hash table-based unique.