Pandas Dataframe groupby + agg + lambda + уникальный бросок ValueError - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть таблица, которая выглядит следующим образом: 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()
                                                       })

The lambda x: x.unique() вызывает следующую ошибку:

ValueError: Function does not reduce

В ходе тестирования я обнаружил, что если я изменю последнюю лямбда-функцию agg на.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 голосов
/ 11 декабря 2018

Вы можете попробовать это:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...