我有一个大的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
你可以试试:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。