熊猫数据框groupby + agg + lambda +唯一抛出ValueError

时间:2018-12-11 16:57:48

标签: python pandas lambda

我有一个名为rev_df的表格。

       pcid     date        rep     rev    new_rev  diff    Period
0      523468   2017-01-01  1127    16.60   0       NaN     1
1      523468   2017-01-02  1127    41.32   0       1       1
2      523468   2017-01-03  4568    52.39   0       1       1
3      523468   2017-01-04  4568    47.31   0       1       2

这是引起某些问题的代码行。

rev_df_period = rev_df.groupby(['pcid', 'Period']).agg({'date': [np.min,np.max], 
                                                        'rev':np.sum,
                                                        'new_prod_rev':np.sum,
                                                        'historical_sales_rep': lambda x: x.unique()
                                                       })

lambda x: x.unique() 导致以下错误:

ValueError: Function does not reduce

通过测试,我发现如果将最后一个agg lambda函数更改为.nunique(),则不会引发错误。但是我需要唯一的rep值的列表,而不是值的数量

有什么想法吗?

输出应如下所示:

                new_rev        date              rev      rep
                sum     amin         amax        sum      unique
pcid    Period                      
523468  1       0       2017-01-01   2017-02-01  1026.94  [1127,4568]
        2       0       2017-03-24   2017-03-30  90.00    4568

1 个答案:

答案 0 :(得分:2)

您可以尝试以下方法:

df.groupby(['pcid', 'Period']).agg({'date': [np.min,np.max], 
                                                        'rev':np.sum,
                                                        'new_rev':np.sum,
                                                        'rep': lambda x: list(set(x))
                                                       })

输出:

                     date                 rev new_rev           rep
                     amin        amax     sum     sum      <lambda>
pcid   Period                                                      
523468 1       2017-01-01  2017-01-03  110.31       0  [4568, 1127]
       2       2017-01-04  2017-01-04   47.31       0        [4568]

编辑以获得正确的列命名

f = lambda x: list(set(x))
f.__name__ = 'unique'

rev_df.groupby(['pcid', 'Period']).agg({'date': [np.min,np.max], 
                                                        'rev':np.sum,
                                                        'new_rev':np.sum,
                                                        'rep': f
                                                       })

输出:

                     date                 rev new_rev           rep
                     amin        amax     sum     sum        unique
pcid   Period                                                      
523468 1       2017-01-01  2017-01-03  110.31       0  [4568, 1127]
       2       2017-01-04  2017-01-04   47.31       0        [4568]