在函数内分组没有正确分组

时间:2018-06-01 23:44:53

标签: python pandas

所以我试图创建一个可以让我根据许多因素快速创建数据透视表的函数。但是,每次运行它时,该函数都不会丢弃索引,而索引又不会聚合数据。

例如,这是我一直在使用的dframe之一

     User_ID    Trans_Type  Date      Revenue    Cohort    Month
0   958507335   Purchase    2013-02-01  22.0    2013-02   2013-02
1   77396089    Purchase    2013-02-01  50.0    2013-02   2013-04
2   168623910   Sale        2013-02-01  20.0    2013-02   2013-02
3   124390583   Sale        2013-02-01  53.0    2013-02   2013-03
4   312221573   Sale        2013-02-01  160.0   2013-02   2013-04
5   767171090   Sale        2013-02-01  56.0    2013-02   2013-04
6   328835282   Sale        2013-02-01  76.0    2013-02   2013-02
7   289850608   Sale        2013-02-01  27.0    2013-02   2013-06
8   926145734   Sale        2013-02-01  16.0    2013-02   2013-02
9   950422305   Sale        2013-02-01  49.0    2013-02   2013-04

基本上,有两种交易类型。买卖。

这是我用来创建数据透视表的函数。

x = 'Sale'
df = df.set_index('User_ID', inplace=True)

def LTV_calc_(df):
    df1 = df[df['Transaction_Type'] == x]
    #Convert to a pivot table
    df2 = df1.groupby(['Cohort','Month'])
    df3 = df2.agg({'User_ID': ['count'],
               'Revenue': ['sum']})

    return df3
Sales = df.groupby(level=0).apply(LTV_calc_)

现在,当我运行Sales DF时,会出现类似这样的内容:

                      User_ID Revenue
                      count   sum
        Cohort  Month       
16940   2013-02 2013-02  1  59.0
16941   2013-02 2013-02  1  62.0
16942   2013-04 2013-04  1  288.0
16943   2013-02 2013-02  1  33.0
16944   2013-05 2013-05  1  14.0
16945   2013-03 2013-03  1  0.0

每当我在没有函数的情况下运行代码时,它就会正确地生成:

               User_ID  Rev/Payout
               count    sum
Cohort  Month       
2013-02 2013-02  293   8449.0
        2013-03  41    1208.0
        2013-04  52    1708.0
        2013-05  55    2469.0
        2013-06  62    2911.0

我曾经有过这个问题。

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

无需调用groupby()。apply(),只需调用函数进行计算。

import pandas as pd

x = 'Sale'

def LTV_calc_(df):
    return df[df['Trans_Type'] == x].groupby(['Cohort','Month']).agg({'User_ID': ['count'],
               'Revenue': ['sum']})

Sales = LTV_calc_(df)

df
Out[79]: 
     User_ID Trans_Type        Date  Revenue   Cohort    Month
0  958507335   Purchase  2013-02-01     22.0  2013-02  2013-02
1   77396089   Purchase  2013-02-01     50.0  2013-02  2013-04
2  168623910       Sale  2013-02-01     20.0  2013-02  2013-02
3  124390583       Sale  2013-02-01     53.0  2013-02  2013-03
4  312221573       Sale  2013-02-01    160.0  2013-02  2013-04
5  767171090       Sale  2013-02-01     56.0  2013-02  2013-04
6  328835282       Sale  2013-02-01     76.0  2013-02  2013-02
7  289850608       Sale  2013-02-01     27.0  2013-03  2013-06
8  926145734       Sale  2013-02-01     16.0  2013-03  2013-02
9  950422305       Sale  2013-02-01     49.0  2013-04  2013-04

Sales
Out[80]: 
                User_ID Revenue
                  count     sum
Cohort  Month                  
2013-02 2013-02       2    96.0
        2013-03       1    53.0
        2013-04       2   216.0
2013-03 2013-02       1    16.0
        2013-06       1    27.0
2013-04 2013-04       1    49.0