Empleados cuyo gerente dej贸 la compan铆a

Encuentre los IDs de los empleados cuyo salario es estrictamente menor a $30000 y cuyo gerente abandon贸 la compan铆a, su informaci贸n se elimina de la tabla Employees, pero los informes siguen teniendo su manager_id establecido en el gerente que se fue. Regrese el resultado ordenado por employee_id.

#pandas#advanced-select

Tabla: Employees

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| name        | varchar  |
| manager_id  | int      |
| salary      | int      |
+-------------+----------+

- employee_id es la llave primaria.
- Esta tabla contiene informaci贸n de los empleados, su salario y el ID de su gerente. Algunos empleados no
  tienen un gerente asignado (manager_id es null). 

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Employees:
+-------------+-----------+------------+--------+
| employee_id | name      | manager_id | salary |
+-------------+-----------+------------+--------+
| 3           | Mila      | 9          | 60301  |
| 12          | Antonella | null       | 31000  |
| 13          | Emery     | null       | 67084  |
| 1           | Kalel     | 11         | 21241  |
| 9           | Mikaela   | null       | 50937  |
| 11          | Joziah    | 6          | 28485  |
+-------------+-----------+------------+--------+

Salida:

+-------------+
| employee_id |
+-------------+
| 11          |
+-------------+

Explicaci贸n: 
- Los empleados con un salario menor a $30000 son 1 (Kalel) y 11 (Joziah).
- El gerente de Kalel es el empleado con id = 11, quien a煤n trabaja en la compa帽铆a (Joziah).
- El gerente de Joziah es el empleado con id = 6, quien abandon贸 la compan铆a porque no hay una fila con su id
  en la tabla Employees

Soluci贸n

import pandas as pd


def find_employees(employees: pd.DataFrame) -> pd.DataFrame:
    managers_who_quit = ~employees['manager_id'].isin(employees['employee_id'])
    salary_lt_30k = (employees['salary'] < 30000)

    managers = employees[salary_lt_30k & managers_who_quit].dropna()
    managers.reset_index(drop=True, inplace=True)
    managers.sort_values(by='employee_id', inplace=True)

    return pd.DataFrame({
        'employee_id': managers['employee_id'],
    })


def test_find_employees():
    data = [
        [3, 'Mila', 9, 60301],
        [12, 'Antonella', None, 31000],
        [13, 'Emery', None, 67084],
        [1, 'Kalel', 11, 21241],
        [9, 'Mikaela', None, 50937],
        [11, 'Joziah', 6, 28485]]
    columns = {
        'employee_id': 'Int64',
        'name': 'object',
        'manager_id': 'Int64',
        'salary': 'Int64'
    }
    employees = pd.DataFrame(
        data, columns=columns.keys()
    ).astype(columns)

    exp = pd.DataFrame({'employee_id': [11]})
    got = find_employees(employees)
    pd.testing.assert_frame_equal(got, exp, check_dtype=False)

slackmart blog 漏 2024