#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, как показано выше