最常见的聚合函数

时间:2017-11-23 13:00:29

标签: python pandas dataframe

我有一个如下定义的函数:

def process_trans(chunk):
    grouped_object=chunk.groupby('msno',sort=False) # not sorting results in a minor speedup
    func = {
        'late_count':['sum'],
        'is_discount':['count'],
        'is_not_discount':['count'],
        'discount':['sum'], 'is_auto_renew':['mean'], 'is_cancel':['mean'], 'payment_type' : ['??'}
    result=grouped_object.agg(func)
    return result

如您所见,我知道我可以为每列插入sumcountmean。我可以插入哪种类型的关键字来确定最常出现的payment_type。请注意,每种类型都由整数表示。

我看到人们正在介绍mode,但需要索引0来识别最常用的项目。还有更好的主意吗?

2 个答案:

答案 0 :(得分:1)

我认为您需要value_counts并选择index的第一个值,因为函数返回已排序Series

'payment_type' : lambda x: x.value_counts().index[0]

样本中的所有内容:

chunk = pd.DataFrame({'msno':list('aaaddd'),
                   'late_count':[4,5,4,5,5,4],
                   'is_discount':[7,8,9,4,2,3],
                   'is_not_discount':[4,5,4,5,5,4],
                   'discount':[7,8,9,4,2,3],
                   'is_auto_renew':[1,3,5,7,1,0],
                   'is_cancel':[5,3,6,9,2,4],
                   'payment_type':[1,0,0,1,1,0]})

print (chunk)
   discount  is_auto_renew  is_cancel  is_discount  is_not_discount  \
0         7              1          5            7                4   
1         8              3          3            8                5   
2         9              5          6            9                4   
3         4              7          9            4                5   
4         2              1          2            2                5   
5         3              0          4            3                4   

   late_count msno  payment_type  
0           4    a             1  
1           5    a             0  
2           4    a             0  
3           5    d             1  
4           5    d             1  
5           4    d             0  
grouped_object=chunk.groupby('msno',sort=False)
func = {
        'late_count':['sum'],
        'is_discount':['count'],
        'is_not_discount':['count'],
        'discount':['sum'], 
        'is_auto_renew':['mean'], 
        'is_cancel':['mean'], 
        'payment_type' : [lambda x: x.value_counts().index[0]]}
result=grouped_object.agg(func)
print (result)

     is_not_discount is_discount is_cancel discount late_count is_auto_renew  \
               count       count      mean      sum        sum          mean   
msno                                                                           
a                  3           3  4.666667       24         13      3.000000   
d                  3           3  5.000000        9         14      2.666667   

     payment_type  
         <lambda>  
msno               
a               0  
d               1  

答案 1 :(得分:1)

您可以使用series.mode

func = {
        'late_count':['sum'],
        'is_discount':['count'],
        'is_not_discount':['count'],
        'discount':['sum'], 'is_auto_renew':['mean'], 'is_cancel':['mean'],
        'payment_type': lambda x : x.mode()}
# Data from @ jezrael. 

grouped_object.agg(func).rename(columns={'<lambda>': 'mode'})

输出:

is_not_discount is_auto_renew late_count payment_type discount  \
               count          mean        sum         mode      sum   
msno                                                                  
a                  3      3.000000         13            0       24   
d                  3      2.666667         14            1        9   

     is_discount is_cancel  
           count      mean  
msno                        
a              3  4.666667  
d              3  5.000000