If-elif-else объединяется с group-by для создания нового столбца - PullRequest
0 голосов
/ 07 марта 2020

У меня есть первые 4 столбца, и я хочу создать * 5-й:

user     date             visit_num     total_visits_user          *last_cust__visit*
1       1995-10-01            1                2                     1995-10-02 
1       1995-10-02            2                2                     1995-10-02  
2       1995-10-01            1                3                     1995-10-03
2       1995-10-02            2                3                     1995-10-03
2       1995-10-03            3                3                     1995-10-03
3       1995-10-01            1                5                     1995-10-05
3       1995-10-02            2                5                     1995-10-05
3       1995-10-03            3                5                     1995-10-05
3       1995-10-04            4                5                     1995-10-05
3       1995-10-05            5                5                     1995-10-05
4       1995-10-03            1                2                     1995-10-04
4       1995-10-04            2                2                     1995-10-04

* last_cust_ посещения - это новый столбец, отображающий дату последнего посещения клиент.

Я пытался, если, elif, еще в сочетании с groupby, но, к сожалению, я не мог заставить его работать.

Любая помощь будет высоко оценена. Спасибо

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Простой способ - использовать transform метод pd.groupby:

df["last_cust_visit"] = df.groupby("user")["date"].transform('max')

При transform выходной информационный кадр будет иметь такое же количество строк, что и df:

    user        date  visit_num  total_visits_user last_cust_visit
0      1  1995-10-01          1                  2      1995-10-02
1      1  1995-10-02          2                  2      1995-10-02
2      2  1995-10-01          1                  3      1995-10-03
3      2  1995-10-02          2                  3      1995-10-03
4      2  1995-10-03          3                  3      1995-10-03
5      3  1995-10-01          1                  5      1995-10-05
6      3  1995-10-02          2                  5      1995-10-05
7      3  1995-10-03          3                  5      1995-10-05
8      3  1995-10-04          4                  5      1995-10-05
9      3  1995-10-05          5                  5      1995-10-05
10     4  1995-10-03          1                  2      1995-10-04
11     4  1995-10-04          2                  2      1995-10-04
0 голосов
/ 07 марта 2020

Вы можете группировать по user, чтобы получить максимум date и объединить его с исходным фреймом данных:

df['last_cust_visit'] = df.merge(df.groupby('user')['date'].max()
                                 .reset_index(), on='user', suffixes=('_', '')
                                 )['date']

Это дает ожидаемое:

    user        date  visit_num  total_visits_user last_cust_visit
0      1  1995-10-01          1                  2      1995-10-02
1      1  1995-10-02          2                  2      1995-10-02
2      2  1995-10-01          1                  3      1995-10-03
3      2  1995-10-02          2                  3      1995-10-03
4      2  1995-10-03          3                  3      1995-10-03
5      3  1995-10-01          1                  5      1995-10-05
6      3  1995-10-02          2                  5      1995-10-05
7      3  1995-10-03          3                  5      1995-10-05
8      3  1995-10-04          4                  5      1995-10-05
9      3  1995-10-05          5                  5      1995-10-05
10     4  1995-10-03          1                  2      1995-10-04
11     4  1995-10-04          2                  2      1995-10-04
...