У меня есть фрейм данных с двумя столбцами: класс (0/1) и время (целое число). Мне нужно добавить третий столбец, в котором будет оставшееся время для получения строки класса 1.
df = pd.DataFrame([
[1,101], [1,104],
[0,107], [0,110], [0,123],
[1,156],
[0,167]],
columns=['class', 'time'])
- Если строка имеет класс 0;
diff
должно быть 0. - Если строка имеет класс 1;
diff
должно быть разницей между time
и time
первой следующей строки с классом 0.
Я могу вычислить его с помощью лямбда-функции:
df['diff'] = df.apply(lambda x: df[ (df['time'] >= x[1]) & (df['class']==0)]['time'].iloc[0] - x[1], axis=1)
введите описание изображения здесь
Выражение df[ (df['time'] >= x[1]) & (df['class']==0)]
запускается для каждой строки, чтобы получить следующую строку с классом 0. Я считаю, что это неэффективно для больших фреймов данных.
Что было бы более эффективным как это вычислить?