Я хотел бы заполнить столбцы данных с разницей во времени между текущей и ближайшей временными метками типа «тип А» или «не тип А» соответственно, т. Е. Type_A = 1 или type_A = 0. Далее показано небольшое пример:
import numpy as np
import pandas as pd
from datetime import datetime
df = pd.DataFrame({'id':[1,2,3,4],
'tmstmp':[datetime(2018,5,4,13,27,10), datetime(2018,5,3,13,27,10),
datetime(2018,5,2,13,27,10), datetime(2018,5,1,13,27,10)],
'type_A':[0, 1, 0, 1],
'dt_A': [np.nan]*4,
'dt_notA': [np.nan]*4
})
(строки A и не A не обязательно чередуются, но столбец отметки времени уже отсортирован в порядке убывания). Я вычисляю разницу во времени между отметкой времени в текущей строке и следующей строке с type_A = 1 или type_A = 0, соответственно, путем итерации по целочисленному индексу строки и элементам доступа по этому целочисленному индексу и имени столбца:
keys = {1: 'dt_A', 0: 'dt_notA'}
ridx = 0
while ridx + 1 < df.shape[0]:
ts1 = df.iloc[ridx]['tmstmp']
ts2 = df.iloc[ridx + 1]['tmstmp']
found = 0 if df.iloc[ridx + 1]['type_A'] == 0 else 1
key = keys[found]
df.loc[ridx, key] = (ts1 - ts2).total_seconds()/3600
complement = 1 - found
j = 2
while ridx + j < df.shape[0] and df.iloc[ridx + j]['type_A'] != complement:
j += 1
if ridx + j < df.shape[0]:
ts1 = df.iloc[ridx]['tmstmp']
ts2 = df.iloc[ridx + j]['tmstmp']
val = (ts1 - ts2).total_seconds()/3600
else:
val = np.nan
df.loc[ridx, keys[complement]] = val
ridx += 1
Итерации по фрейму данных "не рекомендуется" из соображений эффективности (см. Как перебирать строки в фрейме данных в Pandas? ), а использование целочисленных индексов еще меньше "pythoni c ", поэтому мой вопрос таков: в этом конкретном случае есть ли" лучший "(более эффективный, более питонийный c) способ перебирать кадр данных для достижения поставленной задачи? Большое спасибо за любые предложения или мысли!
Редактировать : входные и выходные кадры данных для небольшого примера - столбец dt_A
содержит дельты времени между текущей строкой и следующей, которая имеет type_A = 1
, dt_notA
содержит дельты времени с ближайшей строкой, которая имеет type_A = 0
.
input:
id tmstmp type_A dt_A dt_notA
0 1 2018-05-04 13:27:10 0 NaN NaN
1 2 2018-05-03 13:27:10 1 NaN NaN
2 3 2018-05-02 13:27:10 0 NaN NaN
3 4 2018-05-01 13:27:10 1 NaN NaN
вывод:
id tmstmp type_A dt_A dt_notA
0 1 2018-05-04 13:27:10 0 24.0 48.0
1 2 2018-05-03 13:27:10 1 48.0 24.0
2 3 2018-05-02 13:27:10 0 24.0 NaN
3 4 2018-05-01 13:27:10 1 NaN NaN