Pandas 分组和计数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40480744/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 02:23:43  来源:igfitidea点击:

Pandas Group By and Count

pythonpandascountgroup-byapply

提问by Riley Hun

A pandas dataframe df has 3 columns:

Pandas数据框 df 有 3 列:

user_id, session, revenue

user_id,会话,收入

What I want to do now is group df by unique user_id and derive 2 new columns - one called number_sessions (counts the number of sessions associated with a particular user_id) and another called number_transactions (counts the number of rows under the revenue column that has a value > 0 for each user_id). How do I go about doing this?

我现在想要做的是按唯一的 user_id 对 df 进行分组并派生 2 个新列 - 一个称为 number_sessions(计算与特定 user_id 关联的会话数)和另一个称为 number_transactions(计算具有每个 user_id 的值 > 0)。我该怎么做?

I tried doing something like this:

我尝试做这样的事情:

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

采纳答案by jezrael

I think you can use:

我认为你可以使用:

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

回答by piRSquared

I'd use nuniquefor sessionto not double count the same session for a particular user

我用nuniquesession不加倍特定用户数相同的会话

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

在此处输入图片说明

setup

设置

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