Python。大数据。需要从单元格中提取 Web 浏览器和操作系统用户的偏好。最佳性能方法?

Posted

技术标签:

【中文标题】Python。大数据。需要从单元格中提取 Web 浏览器和操作系统用户的偏好。最佳性能方法?【英文标题】:Python. BigData. Need to extract Web-Browser and OS users' preferences from cells. Best-performance method? 【发布时间】:2016-05-09 01:24:24 【问题描述】:

所以。我们有一个干净的数据框,它由凌乱的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

到数据帧以在数据帧中创建两个新的单独列(浏览器和操作系统)?

【问题讨论】:

如果找不到模块,jupyter notebook 可能正在使用不同的 python 安装 哇,我重新安装了 anaconda / iPython + Jupyer,现在一切正常。现在我将主题重命名为第二个问题:你将如何使用数据框来做到这一点:)) 【参考方案1】:

这可行,但速度很慢:

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。大约需要。我的笔记本上每 100 万行需要 9 分钟

【讨论】:

以上是关于Python。大数据。需要从单元格中提取 Web 浏览器和操作系统用户的偏好。最佳性能方法?的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历指定文件夹中的所有 excel 文件,并从特定单元格中提取数据的代码

从表格中提取文本并比较单元格 - python docx

有没有办法从 OpenOffice Calc 中的单元格中提取子字符串?

怎样提取excel单元格中的部分数字

有时如何使用 Xpath 从包含链接的表格单元格中提取数据?

如何从包装的文本单元格中提取特定的文本行?