У меня есть два столбца в фрейме данных (a и b). Примечание. Здесь я показываю только серии, но делаю вид, что извлекаю эти серии из фрейма данных с индексом строки, который мне известен (iloc).
Я пытаюсь извлечь некоторые числа из столбца B и вычислить интервалы в новую серию, а затем использовать его для выполнения некоторых операций со столбцом a.
Интервалы следующие:
b[2]-b[1]
b[3]-b[2]
b[4]-b[3]
У меня есть код, который работает, но он вроде, ну не уродливый, но немного тяжелый. У меня есть ощущение, что есть функция, которая могла бы это сделать.
По сути, я создаю пустой массив, а затем выполняю итерацию в требуемом диапазоне для вычисления интервала. Есть ли лучший способ продолжить?
a = pd.Series(data=[10, 11, 12, 13, 14, 15], name='a')
b = pd.Series(data=[2,3,5,8,12,17], name='b')
ar = np.array([])
for i in range(1,4):
temp = b[i+1] - b[i]
ar = np.append(ar, temp)
Result = a.iloc[2:5] * ar
Я использовал здесь числа, но моя настоящая цель - сделать это с данными отметок времени. Мне нужна временная разница между строкой [i + 1] и строкой [i], а затем мне нужно выполнить некоторые операции. Вот почему я пытаюсь рассчитать эти интервалы. Я просто пренебрегал отметками времени, чтобы их было легче читать и понимать.






IIUC, используйте diff() и нарежьте любой диапазон, который хотите
b.diff()[2:5] * a[2:5]
Как @sacul предложил в комментариях, также можно разрезать только один раз и отбросить позже b.diff()[2:5].mul(a).dropna(), даже если это будет означать создание большого количества NaN, что для больших df может быть невыгодным
Вот и все ? Одна строчка кода? И это работает. Я могу использовать рассчитанный ранее индекс. Большое спасибо. Это сделает мою жизнь намного проще.
отлично! +1, и, конечно, более действенный, чем мой ответ (удален). Вы также можете использовать
b.diff()[2:5].mul(a).dropna(), не разрезаяa. Не то чтобы это обязательно лучше, но немного другой подход