Pandas分组与计数

4
一个pandas dataframe df有三列: user_id, session, revenue 现在我想按照唯一的user_id分组,并派生出两个新列——一个称为number_sessions(计算与特定user_id相关联的会话数),另一个称为number_transactions(计算每个user_id下具有值> 0的revenue列行数)。 我该如何做到这一点?
我尝试了这样做:
df.groupby('user_id')['session', 'revenue'].agg({'number sessions': lambda x: len(x.session), 
'number_transactions': lambda x: len(x[x.revenue>0])})

没有问题或问题陈述 - Robin Gertenbach
2个回答

4

我认为你可以使用:

df = pd.DataFrame({'user_id':['a','a','s','s','s'],
                   'session':[4,5,4,5,5],
                   'revenue':[-1,0,1,2,1]})

print (df)
   revenue  session user_id
0       -1        4       a
1        0        5       a
2        1        4       s
3        2        5       s
4        1        5       s

a = df.groupby('user_id') \
      .agg({'session': len, 'revenue': lambda x: len(x[x>0])}) \
      .rename(columns={'session':'number sessions','revenue':'number_transactions'})
print (a)
         number sessions  number_transactions
user_id                                      
a                      2                    0
s                      3                    3

a = df.groupby('user_id') \
      .agg({'session':{'number sessions': len}, 
            'revenue':{'number_transactions': lambda x: len(x[x>0])}}) 
a.columns = a.columns.droplevel()

print (a)
         number sessions  number_transactions
user_id                                      
a                      2                    0
s                      3                    3

非常感谢!这正是我需要的解决方案。干杯! - Riley Hun

1
我会使用nunique来对session进行计数,以避免为特定用户重复计算相同的会话。
funcs = dict(session={'number sesssions': 'nunique'},
             revenue={'number transactions': lambda x: x.gt(0).sum()})
df.groupby('user_id').agg(funcs)

enter image description here

安装设置。
df = pd.DataFrame({'user_id':['a','a','s','s','s'],
                   'session':[4,5,4,5,5],
                   'revenue':[-1,0,1,2,1]})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接