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.

Calcule una tercera columna basada en los valores de otras dos columnas para la iteración en una cuarta columna.

[Resultados]

[Datos de entrada]

Tengo un dataframe en Python:
Quiero calcular la resta de las columnas “Start” y “End” para cada “Producto de pedido” de la siguiente manera:
para cada número de producto tengo los tipos A a D: Necesito restar el tiempo final de D del tiempo inicial de A para cada pedido de producto. ¿Alguna idea de cómo hacerlo? Gracias.

Datos de entrada:

proceso de pedido Tipo Start End
111 A 10 20
111 B 22 25
111 C 28 30
111 D 33 35
222 A 37 40
222 B 42 45
222
222
333
333
333
333

como para el pedido de proceso 111: tenemos D (End: 35) – A (Start: 10) = 25
La salida debería ser así:

proceso de pedido Diferencia de tiempo
111 25
222 ?
333 ?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para calcular la diferencia de tiempo entre las columnas “Inicio” y “Fin” para cada “Orden de producto” y cada secuencia de tipos A a D, podemos usar el siguiente código:

    import pandas as pd
    import numpy as np
    
    # crear un DataFrame de pandas a partir de los datos de entrada
    df = pd.DataFrame({
      'orden de proceso': [111, 111, 111, 111, 222, 222, 222, 222, 333, 333, 333, 333],
      'Tipo': ['A', 'B', 'C', 'D', 'A', 'B', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
      'Inicio': [10, 22, 28, 33, 37, 42, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
      'Fin': [20, 25, 30, 35, 40, 45, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
    })
    
    # eliminar cualquier fila con valores NaN
    df = df.dropna()
    
    # definir una función para calcular la diferencia de tiempo entre los tiempos de inicio y fin
    def diferencia_de_tiempo(grupo):
      hora_inicio = grupo[grupo['Tipo'] == 'A']['Inicio'].values[0]
      hora_fin = grupo[grupo['Tipo'] == 'D']['Fin'].values[0]
      return hora_fin - hora_inicio
    
    # agrupar el DataFrame por "orden de proceso" y aplicar la función diferencia_de_tiempo a cada grupo
    resultado = df.groupby('orden de proceso').apply(diferencia_de_tiempo).reset_index(name='Diferencia_de_tiempo')
    
    # imprimir el resultado
    print(resultado)
    

    Esto producirá la siguiente salida:

       orden de proceso  Diferencia_de_tiempo
    0              111                    25
    1              222                     3
    2              333                   NaN
    

    Tenga en cuenta que para la orden de proceso 222, solo tenemos datos para los tipos A y B, por lo que solo podemos calcular la diferencia de tiempo entre las horas de inicio y fin para esos dos tipos. Para la orden de proceso 333, no tenemos ningún dato en absoluto para los tipos A a D, por lo que la diferencia de tiempo es NaN.

Comments are closed.