La ├║ltima persona que aborda el autob├║s

Hay una fila de personas esperando para abordar un autob├║s. Sin embargo, el autob├║s tiene un l├şmite de peso de 1000 kilogramos, de manera que habr├í ocasiones en que no todas las personas podr├ín abordar. Escribe una soluci├│n para encontrar el person_name de la ├║ltima persona que logr├│ abordar el autob├║s sin exceder el l├şmite de peso. Los casos de prueba son generados de tal forma que la primera persona no exceda el l├şmite de peso permitido.

#pandas#advanced-select

Tabla: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+

- La columna person_id contiene valores ├║nicos.
- Esta tabla contiene la informaci├│n de todas las personas esperando un autob├║s.
- Las columnas person_id y turn contienen n├║meros del 1 a n, donde n es el n├║mero de filas en la tabla.
- turn determina el orden en el cual la gente aborda el autob├║s, donde turn=1 indica que esta fue la primera persona en abordar.
- weight es el peso de la persona en kilogramos.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Queue:
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5         | Alice       | 250    | 1    |
| 4         | Bob         | 175    | 5    |
| 3         | Alex        | 350    | 2    |
| 6         | John Cena   | 400    | 3    |
| 1         | Winston     | 500    | 6    |
| 2         | Marie       | 200    | 4    |
+-----------+-------------+--------+------+

Salida:

+-------------+
| person_name |
+-------------+
| John Cena   |
+-------------+

Explicación: La siguiente tabla está ordenada por el turno para mayor simplicidad.
Turn ID Name Weight Total Weight
1 5 Alice 250 250
2 3 Alex 350 600
3 6 John Cena 400 1000 (├║ltimo en abordar)
4 2 Marie 200 1200 (no pudo abordar)
5 4 Bob 175 ___
6 1 Winston 500 ___

Soluci├│n:

import pandas as pd


def last_passenger(queue: pd.DataFrame) -> pd.DataFrame:
    queue = queue.sort_values(by='turn').reset_index(drop=True)
    queue['cumsum'] = queue['weight'].cumsum()

    board = queue.loc[queue['cumsum'] <= 1000]
    last_passenger = board.last_valid_index()

    return pd.DataFrame({
        'person_name': queue[queue.index==last_passenger]['person_name']
    }).reset_index(drop=True)


def test_last_passenger():
    data = [
        [5, 'Alice', 250, 1],
        [4, 'Bob', 175, 5],
        [3, 'Alex', 350, 2],
        [6, 'John Cena', 400, 3],
        [1, 'Winston', 500, 6],
        [2, 'Marie', 200, 4]
    ]
    queue = pd.DataFrame(
        data, columns=['person_id', 'person_name', 'weight', 'turn']
    ).astype({
        'person_id': 'Int64',
        'person_name': 'object',
        'weight': 'Int64',
        'turn': 'Int64'
    })

    expected = pd.DataFrame(
        [['John Cena']], columns=['person_name']
    ).astype({'person_name': str})

    got = last_passenger(queue)
    pd.testing.assert_frame_equal(got, expected)

slackmart blog ┬ę 2024