es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

pandas – obtener el valor desplazado en una función apply

En un DataFrame tengo dos columnas A y B.
Me gustaría agregar una nueva columna que contenga un nuevo valor calculado en función de la fila actual y anterior de las columnas A y B.
Mi primer enfoque fue usar la función apply:

def calc_C(A,B):
    if A.shift() > A:
        C = B + B.shift(1)...
    else:
        C = ..
    return C
df["C"] = df.apply(lambda x: calc<em>C(x["A"],x["B"]),axis=1)

Pero no puedo acceder a la función shift porque esos parámetros son objetos float64.
También intenté otra forma, pero ahora en una declaración if intenta comparar toda la serie:

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

¿Cómo puedo hacer esto de manera pandas y pythonica sin copiar el conjunto de datos y crear nuevas columnas temporales?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puede usar la función shift() dentro de apply() haciendo referencia al objeto DataFrame dentro de la función. Aquí hay una versión actualizada de su función calc_C() que debería funcionar:

    def calc_C(row):
        if row["A"] > row["A_shifted"]:
            C = row["B"] + row["B_shifted"]
        else:
            C = ...
        return C
    
    df["A_shifted"] = df["A"].shift()
    df["B_shifted"] = df["B"].shift()
    df["C"] = df.apply(calc_C, axis=1)
    df.drop(columns=["A_shifted", "B_shifted"], inplace=True)
    

    En esta versión, apply() pasa cada fila del DataFrame a calc_C() como un objeto Series, y las columnas A_shifted y B_shifted se crean usando shift() fuera de la función. El argumento inplace=True dentro de drop() elimina las columnas temporales A_shifted y B_shifted después de que se usan para calcular la columna C.

Comments are closed.