开发者社区> 问答> 正文

更快的数据框分组行列出

我有一个大的DataFrame(+ 100.000行),看起来像这样:

userId conversion revenue channel 
000001 0          0       Direct
000001 1          15      Organic Search
000001 0          0       Direct
000002 0          0       Social
000002 0          0       Direct
...

并且需要根据userId将多个列值(转化,收入和渠道)分组在一个列表中。

userId conversion revenue    channel 
000001 [0, 1, 0]  [0, 15, 0] [Direct, Organic Search, Direct]
000002 [0, 0]     [0, 0]     [Social, Direct]
...

我目前使用pandas groupby并将这些值聚合到一个列表中,但这很慢(执行时间约为30秒):

grouped = df.groupby(['userId']).agg({
    'channel': lambda x: x.tolist(),
    'conversion': lambda x: x.tolist(),
    'revenue': lambda x: x.tolist()
})

有没有更快(更好)的方法来解决我的问题?

  • 编辑:

我认为我已经找到了一种更好的方法,它将运行时间从+ -30s减少到+ -5s,但是我觉得它仍然可以进行更优化。

channel = df.groupby(['userId']).agg({'channel': '>'.join})['channel'].str.split('>')
conversion = df.groupby(['userId').agg({'conversion': lambda x: '>'.join(map(str, x))})['revenue'].str.split('>')
revenue = df.groupby(['userId']).agg({'revenue': lambda x: '>'.join(map(str, x))})['revenue'].str.split('>')

g_channel_conv = pd.merge(channel, conversion, how='left', on='user')
grouped = pd.merge(g_channel_conv, revenue, how='left', on='user')

问题来源:stackoverflow

展开
收起
is大龙 2020-03-23 23:56:14 597 0
1 条回答
写回答
取消 提交回答
  • 你可以试试:

    grouped = (df.groupby('userId').agg({'channel': '>'.join,
                                        'conversion': lambda x: '>'.join(map(str, x)),
                                        'revenue': lambda x: '>'.join(map(str, x))}))
    
    f = lambda x: x.split('>')
    for c in grouped.columns:
        grouped[c] = grouped[c].apply(f)
    

    回答来源:stackoverflow

    2020-03-23 23:56:20
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载