Python。大数据。需要从单元格中提取 Web 浏览器和 OS 用户的偏好。最佳性能方法?
Python. BigData. Need to extract Web-Browser and OS users' preferences from cells. Best-performance method?
所以。我们有一个干净的数据框,它是由像这样的凌乱 TSV file 组成的(特别感谢@unutbu):
chunksize = 50000 # the number of rows to be processed per iteration
dfs = []
reader = pd.read_table('data/data.tsv', sep='\t+',header=None, engine='python',
iterator=True, chunksize=chunksize)
for df in reader:
df = df.stack().str.extract(r'([^=]*)=(.*)', expand=True).dropna(axis=0)
df.columns = ['field', 'value']
df = df.set_index('field', append=True)
df.index = df.index.droplevel(level=1)
df = df['value'].unstack(level=1)
df = df.fillna('')
df['user_vhost'] = df[['user_vhost', 'vhost', 'canonized_vhost']].apply(lambda x: ''.join(x), axis=1)
df['user_ip'] = df[['user_ip', 'ip']].apply(lambda x: ''.join(x), axis=1)
df.drop('vhost', axis=1, inplace=True)
df.drop('canonized_vhost', axis=1, inplace=True)
df.drop('ip', axis=1, inplace=True)
dfs.append(df)
df = pd.concat(dfs, ignore_index=True)
'user_agent' 单元格如下所示:
user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
想到的一件事是 user_agent 库。你将如何应用 (dataframe.apply/applymap?)
user_agent.browser.family
和
user_agent.os.family
数据框以便在数据框中创建两个新的独立列(浏览器和 os)?
这有效,但速度很慢:
df = pd.DataFrame({'user_agent':['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36']})
# create 10.000 rows DF:
df = pd.concat([df] * 10**4)
def parse_ua_series(ua):
p = user_agents.parse(ua)
return pd.Series([p.browser.family, p.os.family])
def parse_ua_list(ua):
p = user_agents.parse(ua)
return [p.browser.family, p.os.family]
如何申请:
In [83]: df.head().user_agent.apply(parse_ua_series).rename(columns={0:'browser', 1:'os'})
Out[83]:
browser os
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
或
In [85]: df.head().user_agent.apply(parse_ua_list).apply(pd.Series).rename(columns={0:'browser', 1:'os'})
Out[85]:
browser os
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
时间安排:
In [80]: %timeit df.user_agent.apply(parse_ua_series).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.83 s per loop
In [81]:
In [81]: %timeit df.user_agent.apply(parse_ua_list).apply(pd.Series).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.61 s per loop
In [82]:
In [82]: %timeit df.user_agent.apply(lambda x: pd.Series(parse_ua_list(x))).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.78 s per loop
更新:
仅使用 ua_parser
会快一点:
def parse_ua(ua):
p = ua_parser.user_agent_parser.Parse(ua)
return [p.get('os').get('family'), p.get('user_agent').get('family')]
In [103]: %timeit df.user_agent.apply(parse_ua).apply(pd.Series).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.28 s per loop
结论:
最快的方法大约需要。每行 528 微秒。 IE。大约需要在我的笔记本上每 1M 行 9 分钟
所以。我们有一个干净的数据框,它是由像这样的凌乱 TSV file 组成的(特别感谢@unutbu):
chunksize = 50000 # the number of rows to be processed per iteration
dfs = []
reader = pd.read_table('data/data.tsv', sep='\t+',header=None, engine='python',
iterator=True, chunksize=chunksize)
for df in reader:
df = df.stack().str.extract(r'([^=]*)=(.*)', expand=True).dropna(axis=0)
df.columns = ['field', 'value']
df = df.set_index('field', append=True)
df.index = df.index.droplevel(level=1)
df = df['value'].unstack(level=1)
df = df.fillna('')
df['user_vhost'] = df[['user_vhost', 'vhost', 'canonized_vhost']].apply(lambda x: ''.join(x), axis=1)
df['user_ip'] = df[['user_ip', 'ip']].apply(lambda x: ''.join(x), axis=1)
df.drop('vhost', axis=1, inplace=True)
df.drop('canonized_vhost', axis=1, inplace=True)
df.drop('ip', axis=1, inplace=True)
dfs.append(df)
df = pd.concat(dfs, ignore_index=True)
'user_agent' 单元格如下所示:
user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
想到的一件事是 user_agent 库。你将如何应用 (dataframe.apply/applymap?)
user_agent.browser.family
和
user_agent.os.family
数据框以便在数据框中创建两个新的独立列(浏览器和 os)?
这有效,但速度很慢:
df = pd.DataFrame({'user_agent':['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36']})
# create 10.000 rows DF:
df = pd.concat([df] * 10**4)
def parse_ua_series(ua):
p = user_agents.parse(ua)
return pd.Series([p.browser.family, p.os.family])
def parse_ua_list(ua):
p = user_agents.parse(ua)
return [p.browser.family, p.os.family]
如何申请:
In [83]: df.head().user_agent.apply(parse_ua_series).rename(columns={0:'browser', 1:'os'})
Out[83]:
browser os
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
或
In [85]: df.head().user_agent.apply(parse_ua_list).apply(pd.Series).rename(columns={0:'browser', 1:'os'})
Out[85]:
browser os
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
0 Chrome Windows 7
时间安排:
In [80]: %timeit df.user_agent.apply(parse_ua_series).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.83 s per loop
In [81]:
In [81]: %timeit df.user_agent.apply(parse_ua_list).apply(pd.Series).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.61 s per loop
In [82]:
In [82]: %timeit df.user_agent.apply(lambda x: pd.Series(parse_ua_list(x))).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.78 s per loop
更新:
仅使用 ua_parser
会快一点:
def parse_ua(ua):
p = ua_parser.user_agent_parser.Parse(ua)
return [p.get('os').get('family'), p.get('user_agent').get('family')]
In [103]: %timeit df.user_agent.apply(parse_ua).apply(pd.Series).rename(columns={0:'browser', 1:'os'})
1 loop, best of 3: 5.28 s per loop
结论:
最快的方法大约需要。每行 528 微秒。 IE。大约需要在我的笔记本上每 1M 行 9 分钟