首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合Dask数据并生成聚合体的数据

聚合Dask数据并生成聚合体的数据
EN

Stack Overflow用户
提问于 2017-09-23 02:15:31
回答 2查看 4.6K关注 0票数 4

我有一个像这样的Dask数据采集器:

代码语言:javascript
复制
url     referrer    session_id ts                  customer
url1    ref1        xxx        2017-09-15 00:00:00 a.com
url2    ref2        yyy        2017-09-15 00:00:00 a.com
url2    ref3        yyy        2017-09-15 00:00:00 a.com
url1    ref1        xxx        2017-09-15 01:00:00 a.com
url2    ref2        yyy        2017-09-15 01:00:00 a.com

我希望将url和time戳上的数据分组,聚合列值,并生成如下所示的dataframe:

代码语言:javascript
复制
customer url    ts                  page_views visitors referrers
a.com    url1   2017-09-15 00:00:00 1          1        [ref1]
a.com    url2   2017-09-15 00:00:00 2          2        [ref2, ref3]

在Spark中,我可以这样做:

代码语言:javascript
复制
select 
    customer,
    url,
    ts,
    count(*) as page_views,
    count(distinct(session_id)) as visitors,
    collect_list(referrer) as referrers
from df
group by customer, url, ts

有什么办法可以用达克数据采集卡吗?我试过了,但只能单独计算聚合列,如下所示:

代码语言:javascript
复制
# group on timestamp (rounded) and url
grouped = df.groupby(['ts', 'url'])

# calculate page views (count rows in each group)
page_views = grouped.size()

# collect a list of referrer strings per group
referrers = grouped['referrer'].apply(list, meta=('referrers', 'f8'))

# count unique visitors (session ids)
visitors = grouped['session_id'].count()

但是我似乎找不到一种好的方法来产生我所需要的综合数据格式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-23 14:27:35

以下几点确实有效:

代码语言:javascript
复制
gb = df.groupby(['customer', 'url', 'ts'])
gb.apply(lambda d: pd.DataFrame({'views': len(d), 
     'visitiors': d.session_id.count(), 
     'referrers': [d.referer.tolist()]})).reset_index()

(假设按照上面的sql,访问者应该是唯一的),您可能希望定义输出的meta

票数 4
EN

Stack Overflow用户

发布于 2018-03-13 09:18:55

这是@j打开的链接到github问题,它提供了一个额外的选项。基于这个问题,我们实现了如下聚合:

custom_agg = dd.Aggregation( 'custom_agg', lambda s: s.apply(set), lambda s: s.apply(lambda chunks: list(set(itertools.chain.from_iterable(chunks)))), )

为了与计数结合,代码如下所示

dfgp = df.groupby(['ID1','ID2']) df2 = dfgp.assign(cnt=dfgp.size()).agg(custom_agg).reset_index()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46375382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档