Панды: заполнение пропущенных значений, повторяющихся через объект groupby - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий набор данных:

d = {'player': ['1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', 
'2', '2', '2', '2', '3', '3', '3', '3', '3'],
'session': ['a', 'a', 'b', np.nan, 'b', 'c', 'c', 'c', 'c', 'd', 'd', 
'e', 'e', np.nan, 'e', 'f', 'f', 'g', np.nan,  'g'],
'date': ['2018-01-01 00:19:05', '2018-01-01 00:21:07', 
'2018-01-01 00:22:07', '2018-01-01 00:22:15','2018-01-01 00:25:09', 
'2018-01-01 00:25:11', '2018-01-01 00:27:28', '2018-01-01 00:29:29', 
'2018-01-01 00:30:35', '2018-01-01 00:21:16', '2018-01-01 00:35:22', 
'2018-01-01 00:38:16', '2018-01-01 00:38:20', '2018-01-01 00:40:35', 
'2018-01-01 01:31:16', '2018-01-03 00:55:22', '2018-01-03 00:58:16', 
'2018-01-03 00:58:21', '2018-03-01 01:00:35', '2018-03-01 01:31:16']
}

#create dataframe
df = pd.DataFrame(data=d)
#change date to datetime
df['date'] =  pd.to_datetime(df['date']) 

df.head()

     player session        date
0       1       a 2018-01-01 00:19:05
1       1       a 2018-01-01 00:21:07
2       1       b 2018-01-01 00:22:07
3       1     NaN 2018-01-01 00:22:15
4       1       b 2018-01-01 00:25:09

Итак, это мои три столбца:

  1. 'player' - с тремя игроками (1,2,3) - dtype = object
  2. 'сессия' (объект). Каждый идентификатор сеанса группирует набор действий (то есть строк в наборе данных), которые игроки реализовали в сети.
  3. 'date' (объект datetime) сообщает нам время, когда было выполнено каждое действие.

Проблема в этом наборе данных состоит в том, что у меня есть временные метки для каждого действия, но в некоторых действиях отсутствует идентификатор сеанса. Я хочу сделать следующее: для каждого игрока я хочу дать метку идентификатора для пропущенных значений, основываясь на временной шкале. Действия, в которых отсутствует их идентификатор, могут быть помечены, если они попадают во временной диапазон (первое действие - последнее действие) определенного сеанса.

Допустим, я сгруппировал игрока и идентификатор и вычислил временной интервал для каждой сессии:

my_agg = df.groupby(['player', 'session']).date.agg([min, max])
my_agg

                           min                 max
player session                                        
1      a       2018-01-01 00:19:05 2018-01-01 00:21:07
       b       2018-01-01 00:22:07 2018-01-01 00:25:09
       c       2018-01-01 00:25:11 2018-01-01 00:30:35
2      d       2018-01-01 00:21:16 2018-01-01 00:35:22
       e       2018-01-01 00:38:16 2018-01-01 01:31:16
3      f       2018-01-03 00:55:22 2018-01-03 00:58:16
       g       2018-01-03 00:58:21 2018-03-01 01:31:16

В этот момент я хотел бы пройтись по каждому игроку и сравнить временную метку моих значений nan, сеанс за сеансом, чтобы увидеть, где они принадлежат.

Желаемый вывод : В этом примере первая Nan должна быть помечена как 'b' , вторая - как 'e' , а последняя как 'g' .

Отказ от ответственности : я задал похожий вопрос несколько дней назад (см. Здесь) , и получил очень хороший ответ, но на этот раз я должен принять во внимание другую переменную, и я я снова застрял. Действительно, первые шаги в Python являются захватывающими, но очень сложными.

1 Ответ

0 голосов
/ 31 августа 2018

Ваш пример уже отсортирован, однако это должно дать желаемый результат даже в том случае, если ваши входные данные не отсортированы. Если этот ответ не удовлетворяет вашим требованиям, опубликуйте дополнительный (или измененный) образец кадра данных с ожидаемым выводом, если это нарушает ваши требования.

df.sort_values(['player','date']).fillna(method='ffill')

Урожайность:

   player session                date
0       1       a 2018-01-01 00:19:05
1       1       a 2018-01-01 00:21:07
2       1       b 2018-01-01 00:22:07
3       1       b 2018-01-01 00:22:15
4       1       b 2018-01-01 00:25:09
5       1       c 2018-01-01 00:25:11
6       1       c 2018-01-01 00:27:28
7       1       c 2018-01-01 00:29:29
8       1       c 2018-01-01 00:30:35
9       2       d 2018-01-01 00:21:16
10      2       d 2018-01-01 00:35:22
11      2       e 2018-01-01 00:38:16
12      2       e 2018-01-01 00:38:20
13      2       e 2018-01-01 00:40:35
14      2       e 2018-01-01 01:31:16
15      3       f 2018-01-03 00:55:22
16      3       f 2018-01-03 00:58:16
17      3       g 2018-01-03 00:58:21
18      3       g 2018-03-01 01:00:35
19      3       g 2018-03-01 01:31:16
...