панды — получить сдвинутое значение в функции применить

#python #pandas #apply #shift

Вопрос:

В фрейме данных у меня есть два столбца A и B. Я хотел бы добавить новый столбец, содержащий новое значение, рассчитанное на основе текущей и предыдущей строки столбцов A и B. Мой первый подход состоял в том, чтобы использовать функцию apply

 def calc_C(A,B):  if A.shift() gt; A:  C = B   B.shift(1)...  else:  C = ..  return C  df["C"] = df.apply(lambda x: calc_C(x["A"],x["B"]),axis=1)  

Но я не могу получить доступ к функции shift, потому что эти параметры являются объектами float64. Я также пробовал другой способ, но теперь в операторе if он пытается сравнить целые серии.

 def calc_C(df):  if df["A"] gt; df["A"].shift()   C= df["B"]   df["B"].shift()  else:  C = ..  return C df["C"] = calc_C(df)  

Как я могу сделать это с помощью pythonic pandas, не копируя набор данных и не создавая новые временные столбцы?

Комментарии:

1. Пожалуйста, предоставьте образец вашего входного кадра данных вместе с ожидаемым результатом.

Ответ №1:

Вам не обязательно создавать новые столбцы в вашем фрейме данных, но было бы намного эффективнее работать с объектами серии векторизованным способом. Вот несколько примеров кода

 a_shifted = df["A"].shift() b_shifted = df["B"].shift() df["C"] = np.where(df["A"] gt; a_shifted, df["B"]   b_shifted, ...)  

Комментарии:

1. можно ли это сделать, когда результирующее значение C вычисляется функцией, которая принимает все 4 параметра? например, в случае, когда A gt; a_шифровал его gt; foo(A,a_shifted,B,B_shifted) ? и в другом случае его аналогичная функция

2. Функция работает до тех пор, пока она возвращает ряд с тем же индексом, что и фрейм данных, в который вы хотите добавить C, хотя, если это ваша сигнатура функции, вероятно, проще передать фрейм данных и просто вычислить a_shifted и b_shifted, как показано выше