🐼 ¿Cómo hacer una nueva columna y asignar valores de forma condicional? | Pandas | Python

Поделиться
HTML-код
  • Опубликовано: 24 окт 2024

Комментарии • 18

  • @cctmexico
    @cctmexico  3 года назад +4

    ⏰ Por si tienes prisa, aquí te dejamos el minuto a minuto del vídeo:
    00:00 Introducción
    02:22 np.where: Una sola columna
    05:22 np.where: Más de una columna
    07:01 np.where: Lista de columnas
    09:21 np.select: Listas de condiciones y opciones

  • @jariassh
    @jariassh 2 года назад +1

    Nuevo suscriptor !!! Mil gracias por tu explicación me sirvió muchisimo, yo recien estoy aprendiendo python, soy principiante en programación a nivel general, sin embargo en mi caso necesitaba evaluar dos grupos de columnas, un grupo recibía un valor u otro grupo de columnas otro valor, finalmente de los dos solo podía haber una única columna dependiendo el valor de cada uno de los grupos. Ejemplo: "Dos grupos de versiones de cursos, debía evaluar si la persona había completado todos los cursos de la version 1 o entonces era 'Completo v1', o igual si había completado todos los cursos de la version 2, entonces 'Completo v2', si ninguna se cumple entonces tocaba dejarlo como 'Pendiente'". En mi caso, la idea que se me ocurrió y quizás no sea la más optima pero me funciona por el momento para la necesidad.
    def add_conditional_column(data_frame):
    pack_column_1 = []
    pack_column_2 = []
    for column in data_frame.columns:
    if "v1" in column:
    pack_column_1.append(column)
    if "v2" in column:
    pack_column_2.append(column)
    data_frame['ESTADO_1'] = np.where((data_frame[pack_column_1].isna() ).any(axis=1), "Pendiente", "Completo v1")
    data_frame['ESTADO_2'] = np.where((data_frame[pack_column_2].isna() ).any(axis=1), "Pendiente", "Completo v2")

    conditions = [
    (data_frame['ESTADO_1'] != "Pendiente"),
    (data_frame['ESTADO_2'] != "Pendiente"),
    (data_frame['ESTADO_1'] == "Pendiente") & (data_frame['ESTADO_2'] == "Pendiente"),
    ]
    options = ['Completo v1', 'Completo v2', "Pendiente"]

    status_series = np.select(conditions, options)

    data_frame.drop(['ESTADO_1', 'ESTADO_2'], axis=1, inplace=True)

    data_frame.insert(loc=4,
    column= "ESTADO",
    value = status_series)

    return data_frame
    Gracias por compartir tus conocimientos !!! ❣

    • @cctmexico
      @cctmexico  2 года назад

      ¡Muchísimas gracias por tan amable comentario! y sobre todo por tan valioso aporte

  • @josemiguelruizarrivillaga644
    @josemiguelruizarrivillaga644 3 года назад +1

    Excelente aprendiendo mucho, gracias.

  • @anayaribatista9697
    @anayaribatista9697 2 года назад

    Hola, excelente video.
    Consulta, si en lugar de dos salidas (Recuperación y Felices...) tengo 450, por cada valor de una columna tengo que agregar un ID único.. Son 450 valores que se repiten

  • @yulij7603
    @yulij7603 3 года назад +2

    Oh gracias creo que algunas pregunté cómo se podía hacer eso , gracias!!!!

  • @sofiasaldarriaga1131
    @sofiasaldarriaga1131 3 года назад +1

    Mil gracias, me sirvió muchísimo!!

  • @rnavarropelaez
    @rnavarropelaez 2 года назад

    Hola, excelente video! absolutamente didáctico, te felicito. Aprovecho para preguntar si hay algún video explicativo para comparar 2 data frames de modo que al tomar una columna de cada df y compararlas entre sí, en caso de que los valores sean iguales entonces me agregue en el primer df el valor de una 3er columna que se encuentra en el segundo df: esto se hace habitualmente en sql y es verdaderamente simple pero no encuentro para Python la sintaxis equivalente para hacerlo, desde ya muchas gracias!

    • @fativilla
      @fativilla 2 года назад

      Tengo la misma pregunta :), por si acaso lo resolviste?

    • @rnavarropelaez
      @rnavarropelaez 2 года назад +3

      @@fativilla Hola! si, ese mismo día investigando un poco encontré la solución, debés usar pd.merge el cual emula a la función join en sql (no he investigado mucho aún pero no es el mismo join que se usa en python), en mi caso yo necesitaba lo que en sql se denomina un "left join" o sea comparar 2 tablas o dataframes de modo que el resultado de la comparación me traiga todos los registros (filas) del primer dataframe (por eso es "left") tal que se verifique para el campo usado para la comparación si hay coincidencias con el campo del segundo dataframe: si las hay, trae los datos correspondientes; sino hay coincidencias entonces rellena con valores "null" las columnas anexadas. En mi caso concreto para el notebook que necesitaba correr escribí esto (dado que usé esto para algo laboral cambio los nombres de los dfs y campos)
      df_resultado = pd.merge(df_1, df_2, how = 'left', on = 'campo_a_comparar')
      Aprovecho para decir que "df_resultado" no es necesario para correr esa línea pero yo necesitaba almacenar en un dataframe el resultado. Vale aclarar además, que la sintaxis usada es válida para dfs no indexados en el cual debés especificar el campo a usar para comparar tal que obviamente este campo exista en ambos dfs (y que claramente en los mismos se contenga el mismo tipo de dato suceptible a ser comparado). De todas formas tengo entendido que incluso estando ambos dfs indexados se puede escribir esa sintaxis para hacer comparaciones por otro campo diferente al indexado. En caso que los dfs estén indexados y quieras comparar por los campos índice no podés escribir la sintaxis usada arriba porque va a dar error y para ese caso debés escribir de este modo:
      pd.merge(df1, df2, how = 'left', left_index = True, right_index = True)
      En este caso a propósito no puse el "df_resultado" para que veas la sintaxis sin guardar el resultado en otro df.
      Las otras opciones a poner en lugar de left son 'right', 'inner' y 'outer' (no sé si estás familiarizada con el join de sql pero básicamente toma de ese concepto la funcionalidad de estos parámetros).
      Una última aclaración, investigando ese día no encontré la forma de sólo traer la o las columnas que me interesaban del dataframe 2 (pd.merge no tiene parámetros adicioales para tal cosa), por lo que al final simplemente eliminé las que no necesitaba del df_resultado con "drop":
      df_resultado.drop(['campo1_a_borrar', 'campo2_a_borrar', 'campo3_a_borrar'], axis = 'columns', inplace=True)
      Espero que te sea útil, en caso que necesites más aclaraciones avisame (hacía días que no cheqieaba este link y de casualidad me fijé hoy), saludos!!

    • @fativilla
      @fativilla 2 года назад +1

      @@rnavarropelaez Excelente Raul, lo logré, gracias por tan valioso aporte!!

  • @valentinachacon5655
    @valentinachacon5655 2 года назад

    Gracias!!!!! Me sirvió un montón :)

  • @TheDavidyisus
    @TheDavidyisus 3 года назад

    Alguien sabe si hay un video en donde explique como guardar el valor de una función en una variable fuera de dicha función?
    En mi caso tengo una tabla con varias columnas, y tengo que sacar la sumatoria de cada columna (hasta esta parte ya lo tengo bien). Ya tengo la función para sacar la sumatoria, y lo guarda en una variable interna de la función.
    Como puedo hacer que el valor de cada resultado se guarde en una variable distinta. Ejemplo: SumX, SumY, SumZ.
    Espero me puedan ayudar y que me haya dado a entender, muchas gracias :)

  • @danielleon1370
    @danielleon1370 2 года назад

    Holo, muchas gracias por sus videos. Tengo un error al usar esta funcion en un codigo se lo dejare por si puede ayudarme. Estoy nuevo en python y pandas.
    codigo:
    operacion = (capa_feature1.iat[0,5] - capa_feature1.iat[0,4] - capa_feature1.iat[1,4])
    capa_feature1['SUM_Area_km2'] = np.where(capa_feature1['Area_km2'] == capa_feature1.iat[0,4], capa_feature1.iat[0,4], operacion)
    capa_feature1
    error:
    UFuncTypeError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('

  • @iasaleperu
    @iasaleperu 2 года назад

    cual es la diferencia entre "|" y "&": el primero sigue la lógica de "O" y la segunda sigue la lógica de "y".
    Pueden darse cuenta comparando entre dos columnas utilizando esos conectores.
    # np.where con mas de una columna de evaluacion con logica '0'
    df['recuperacion U1-U2 logica O'] = np.where((df['U1']