Есть два фрейма данных, оба имеют общий user_id
. Назовем их df_A
и df_B
. df_B
имеет одну запись на пользователя. df_A
содержит несколько записей на пользователя, но для каждого пользователя существует одна запись с NaN
.
user_id start_time time_calc
0 421 2015-10-25 11:42:35 8.97
1 421 2015-10-25 11:51:33 4.85
2 421 2015-10-25 11:56:24 6.77
3 421 2015-10-25 13:03:10 NaN
4 493 2015-10-26 05:08:13 0.85
5 493 2015-10-26 05:09:04 NaN
6 636 2015-10-17 15:30:53 2.55
7 636 2015-10-17 15:33:26 4.17
8 636 2015-10-17 15:37:36 2.35
9 636 2015-10-17 15:39:57 0.32
10 636 2015-10-17 15:40:16 0.43
11 636 2015-10-17 15:40:42 0.65
12 636 2015-10-17 15:41:21 NaN
user_id last_time
0 100 2015-11-04 01:52:16
1 421 2015-10-25 14:03:23
2 493 2015-10-26 05:09:51
3 636 2015-11-03 20:15:54
4 030 2015-11-03 17:44:20
5 174 2015-10-10 00:20:37
6 437 2015-10-24 12:34:38
7 481 2015-10-28 03:18:24
8 952 2015-10-28 21:07:15
9 197 2015-10-18 14:52:34
Цель состоит в том, чтобы заполнить NaN
в df_A
, выполнив df_B.last_time - df_A.start_time
, но только для Nan
, при этом используя правильный user_id
для соответствия записям.
логически: user_id 421 NaN
запись должна быть заполнена следующими данными:
2015-10-25 14:03:23 - 2015-10-25 13:03:10
df_A.groupby('user_id').time_calc.fillna(df_B.last_time - df_A.time_calc.isnull['start_time'])
К сожалению, это не сработало.
@ cᴏʟᴅsᴘᴇᴇᴅ dt.total_seconds.div(60)
, так что это должно быть через несколько минут
Это предположение, которое я сделал, не видел никаких подобных намеков в вашем вопросе, поэтому решил спросить ;-)
Сначала создайте преобразователь значений заполнения, используя merge
в качестве первого шага:
i = df_A[df_A.time_calc.isnull()].merge(df_B)
j = i['last_time'].sub(i['start_time']).dt.total_seconds() / 60
j.index = i.user_id
j
user_id
421 60.216667
493 0.783333
636 24754.550000
dtype: float64
Теперь сделайте fillna
:
df_A['time_calc'] = df_A['time_calc'].fillna(df_A.user_id.map(j))
df_A
user_id start_time time_calc
0 421 2015-10-25 11:42:35 8.970000
1 421 2015-10-25 11:51:33 4.850000
2 421 2015-10-25 11:56:24 6.770000
3 421 2015-10-25 13:03:10 60.216667
4 493 2015-10-26 05:08:13 0.850000
5 493 2015-10-26 05:09:04 0.783333
6 636 2015-10-17 15:30:53 2.550000
7 636 2015-10-17 15:33:26 4.170000
8 636 2015-10-17 15:37:36 2.350000
9 636 2015-10-17 15:39:57 0.320000
10 636 2015-10-17 15:40:16 0.430000
11 636 2015-10-17 15:40:42 0.650000
12 636 2015-10-17 15:41:21 24754.550000
@COLDSPEED что такое v? не должно быть b df_b и df_a
@ Null-Hypothesis Спасибо, это была опечатка.
@COLDSPEED, извините, год пробовал, я получаю сообщение об ошибке, для команды 'jump' требуется номер строки ...
@ Null-Hypothesis Я определенно не распознаю сообщение об ошибке. Возможно, вы случайно скопировали материал и после j.index = i.user_id
?
@COLDSPEED Я набрал не копировал :), но уморительно понял, в чем проблема. j
зарезервирован в отладчике python :)
@ Null-Hypothesis Я не использую отладчик, возможно, поэтому.
Что такое единица времени в
time_calc
? Часы? Дней?