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 agrupar condicionalmente por min()

Estoy tratando de obtener el valor mínimo de una variable de fecha cuando el saldo principal es inferior al 5% del monto desembolsado. Quiero que esto se extraiga por número de cuenta, pero no quiero un nuevo df que esté agrupado por número de cuenta.

Mi df se ve así:

nro_cuenta fecha_periodo saldo_principal monto_desembolsado
1 2021-01-01 10 100
1 2021-02-01 6 100
1 2021-03-01 3 100
1 2021-04-01 0 100
2 2021-01-01 20 100
2 2021-02-01 15 100
2 2021-03-01 11 100
2 2021-04-01 8 100

He intentado códigos similares a este para hacer que funcione, pero solo devuelve sintaxis incorrecta.

df['fecha_churn'] = df.loc[df.groupby('nro_cuenta')['saldo_principal'].apply(lambda x : x <= 0.05 * df['monto_desembolsado']), 'fecha_periodo'].min()

Quiero que el código cree un df que se vea así:

nro_cuenta fecha_periodo saldo_principal monto_desembolsado fecha_churn
1 2021-01-01 10 100 2021-03-01
1 2021-02-01 6 100 2021-03-01
1 2021-03-01 3 100 2021-03-01
1 2021-04-01 0 100 2021-03-01
2 2021-01-01 20 100 nan
2 2021-02-01 15 100 nan
2 2021-03-01 11 100 nan
2 2021-04-01 8 100 nan
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el valor mínimo de la variable de fecha cuando el saldo principal está por debajo del 5% del monto del desembolso, puedes utilizar la función groupby de pandas y aplicar una función lambda que filtre las filas basadas en la condición dada, y luego obtenga el valor mínimo de la columna period_date.

    Aquí está el código que debería funcionar para ti:

    # crear un dataframe temporal con las filas filtradas
    temp_df = df[df['principal_balance_amt'] <= 0.05 * df['disbursement_amt']]
    
    # agrupar el dataframe temporal por número de cuenta
    temp_grouped = temp_df.groupby('account_number')
    
    # aplicar una función lambda para obtener el valor mínimo de period_date
    churn_dates = temp_grouped.apply(lambda x: x['period_date'].min())
    
    # unir la serie churn_dates con el dataframe original en número de cuenta
    result = df.merge(churn_dates, on='account_number', how='left')
    
    # renombrar la columna churn_dates a 'churn_date'
    result.rename(columns={0: 'churn_date'}, inplace=True)
    

    Esto debería darte el dataframe de salida deseado con la columna churn_date agregada en función de la condición dada. Ten en cuenta que para las cuentas donde no hay fechas que cumplan la condición, el valor de churn_date será NaN.

Comments are closed.