熊猫:改进代码

时间:2017-10-20 09:44:35

标签: python pandas

我有一个任务:

数据看起来像

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)

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

1 个答案:

答案 0 :(得分: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() docstring的

PS:

  

返回对象中的唯一值。唯一身份按顺序返回   外观,这不排序。哈希表基于唯一。