我有一个任务:
数据看起来像
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)
我认为这不是一个完美的代码,需要花费很多时间。 我怎样才能改进它?我应该使用什么或者我应该学习和阅读什么?
答案 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:
返回对象中的唯一值。唯一身份按顺序返回 外观,这不排序。哈希表基于唯一。