Как я могу получить дату с groupby в pandas? - PullRequest
1 голос
/ 21 апреля 2020

У меня есть дата df, в которой хранятся заказы пользователей:

    user_id order_date
0         a 2018-01-17
1         a 2018-04-29
2         a 2018-05-19
3         a 2018-05-21
4         a 2018-06-15
5         b 2018-09-18
6         b 2019-01-30
7         b 2019-02-01
8         b 2019-07-03
9         c 2019-07-31
10        c 2019-12-10
11        c 2019-12-12
12        c 2019-12-24

Дата заказа уже заказана. Я хочу знать разницу в размерах пользователей разных заказов. Мне нужно использовать 'groupby', чтобы разделить пользователей, а затем вычислить дату. Результат должен быть:

    user_id   datediff
0         a         NA
1         a        102
2         a         20
3         a          2
4         a         25
5         b         NA
6         b        134
7         b          2
8         b        152
9         c         NA
10        c        132
11        c          2
12        c         12

Я знаю, как получить это, используя наивный l oop. Как сделать это лучше, например, сдвигом или вращением? Кстати, вам не нужно получать точно такой же результат. «NA» может быть «NAT». «102» может быть «102 дня».

Более того, как я могу получить информацию о разных пользователях? Результат должен быть:

    user_id   mean_datediff
0         a           37.25
1         b           68.00   
2         c           48.67

Для пользователя a среднее значение равно (102 + 20 + 2 + 25) /4=37.25, а не 149 / 5.

И последнее шаг это добавить «mean_datediff» к исходному df. Ожидаемый результат:

    user_id order_date mean_datediff
0         a 2018-01-17         37.25
1         a 2018-04-29         37.25
2         a 2018-05-19         37.25
3         a 2018-05-21         37.25
4         a 2018-06-15         37.25
5         b 2018-09-18         68.00
6         b 2019-01-30         68.00
7         b 2019-02-01         68.00
8         b 2019-07-03         68.00
9         c 2019-07-31         48.67
10        c 2019-12-10         48.67
11        c 2019-12-12         48.67
12        c 2019-12-24         48.67

1 Ответ

1 голос
/ 21 апреля 2020

Используйте DataFrameGroupBy.diff для разницы, Series.dt.days для преобразования времени в дни:

df['order_date'] = pd.to_datetime(df['order_date'])

df['datediff'] = df.groupby(['user_id'])['order_date'].diff().dt.days
print (df)
   user_id order_date  datediff
0        a 2018-01-17       NaN
1        a 2018-04-29     102.0
2        a 2018-05-19      20.0
3        a 2018-05-21       2.0
4        a 2018-06-15      25.0
5        b 2018-09-18       NaN
6        b 2019-01-30     134.0
7        b 2019-02-01       2.0
8        b 2019-07-03     152.0
9        c 2019-07-31       NaN
10       c 2019-12-10     132.0
11       c 2019-12-12       2.0
12       c 2019-12-24      12.0

И, если необходимо, добавьте целые числа Series.astype с Int64, работает pandas 0,24 + :

df['order_date'] = pd.to_datetime(df['order_date'])

df['datediff'] = df.groupby(['user_id'])['order_date'].diff().dt.days.astype('Int64')
print (df)
   user_id order_date  datediff
0        a 2018-01-17       NaN
1        a 2018-04-29       102
2        a 2018-05-19        20
3        a 2018-05-21         2
4        a 2018-06-15        25
5        b 2018-09-18       NaN
6        b 2019-01-30       134
7        b 2019-02-01         2
8        b 2019-07-03       152
9        c 2019-07-31       NaN
10       c 2019-12-10       132
11       c 2019-12-12         2
12       c 2019-12-24        12

РЕДАКТИРОВАТЬ:

Для нового столбца, заполненного mean с использованием GroupBy.transform с функцией лямбда:

df['mean_datediff'] = (df.groupby(['user_id'])['order_date']
                         .transform(lambda x: x.diff().dt.days.mean()))
print (df)
   user_id order_date  mean_datediff
0        a 2018-01-17      37.250000
1        a 2018-04-29      37.250000
2        a 2018-05-19      37.250000
3        a 2018-05-21      37.250000
4        a 2018-06-15      37.250000
5        b 2018-09-18      96.000000
6        b 2019-01-30      96.000000
7        b 2019-02-01      96.000000
8        b 2019-07-03      96.000000
9        c 2019-07-31      48.666667
10       c 2019-12-10      48.666667
11       c 2019-12-12      48.666667
12       c 2019-12-24      48.666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...