1. Faro

Nivel 2 · Verifica y resume plantilla y salarios en pandas

La solicitud

De Laura Bennett, Directora de Finanzas

“Acordamos el plan: plantilla, nómina y salario típico por departamento, y luego reportes directos por gerente. La exportación de RR. HH. se ha editado a mano durante años, así que primero dime si cuadra: alguien listado dos veces, gerentes que no están en la lista, salarios que parecen erróneos.”

Tu objetivo

Paso 1 de 3. Verifica la tabla. Haz merge de employees con una copia de su propia columna employee_id (renombrada mgr_id) usando how='left', left_on='manager_id', right_on='mgr_id' e indicator=True. Asigna a result un DataFrame de una fila con employees (filas), distinct_ids, distinct_names (first_name + ' ' + last_name distintos), no_manager (manager_id falta), unknown_manager (manager_id presente pero sin coincidencia) y min_salary y max_salary.

  • Usa el DataFrame employeespendiente
  • Muestra exactamente employees distinct_ids distinct_names no_manager unknown_manager min_salary max_salarypendiente
  • 1 fila, ordenadas como se pidependiente

Paso 1 · tu código

Python

Cargando el editor…

    ResultadoVista previa de employees · presiona Ejecutar para ver el tuyo
    Vista previa de employees
    employee_idfirst_namelast_namedepartmenttitle
    1CatherineHaleExecutiveChief Executive Officer
    2RobertKimExecutiveChief Operating Officer
    3MeganCollinsSalesHead of Sales
    4ChloeGutierrezSalesAccount Executive

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    Paso 2 · tu código

    Python

    Cargando el editor…

      ResultadoVista previa de employees · presiona Ejecutar para ver el tuyo
      Vista previa de employees
      employee_idfirst_namelast_namedepartmenttitle
      1CatherineHaleExecutiveChief Executive Officer
      2RobertKimExecutiveChief Operating Officer
      3MeganCollinsSalesHead of Sales
      4ChloeGutierrezSalesAccount Executive

      Mote revisa tu resultado

      Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

      Paso 3 · tu código

      Python

      Cargando el editor…

        ResultadoVista previa de employees · presiona Ejecutar para ver el tuyo
        Vista previa de employees
        employee_idfirst_namelast_namedepartmenttitle
        1CatherineHaleExecutiveChief Executive Officer
        2RobertKimExecutiveChief Operating Officer
        3MeganCollinsSalesHead of Sales
        4ChloeGutierrezSalesAccount Executive

        Mote revisa tu resultado

        Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

        DataFrames

        Cargados como DataFrames de pandas, junto con pd y np.

        employees60 filas · 8 columnas
        • employee_idinteger
        • first_namevarchar
        • last_namevarchar
        • departmentvarchar
        • titlevarchar
        • manager_idinteger
        • hire_datedate
        • salaryinteger
        Primeras 5 filas de employees
        employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
        1CatherineHaleExecutiveChief Executive OfficerNaN2016-03-01285000
        2RobertKimExecutiveChief Operating Officer12017-01-09235000
        3MeganCollinsSalesHead of Sales12018-04-16172000
        4ChloeGutierrezSalesAccount Executive32020-01-2172000
        5FrankBellSalesAccount Executive32023-05-2173000
        customers2,018 filas · 9 columnas
        • customer_idinteger
        • first_namevarchar
        • last_namevarchar
        • emailvarchar
        • cityvarchar
        • statevarchar
        • signup_datedate
        • segmentvarchar
        • referral_sourcevarchar
        Primeras 5 filas de customers
        customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
        1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
        2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNaN
        3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNaN
        4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
        5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNaN
        products120 filas · 8 columnas
        • product_idinteger
        • namevarchar
        • categoryvarchar
        • subcategoryvarchar
        • unit_pricedecimal
        • unit_costdecimal
        • launched_ondate
        • is_activeboolean
        Primeras 5 filas de products
        product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
        101Vale Velvet LoveseatFurnitureSofas1659.00NaN2023-09-11true
        102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
        103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
        104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
        105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
        orders12,000 filas · 7 columnas
        • order_idinteger
        • customer_idinteger
        • order_datetimestamp
        • statusvarchar
        • channelvarchar
        • shipping_feedecimal
        • coupon_codevarchar
        Primeras 5 filas de orders
        order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
        10011252023-01-01 20:51:19completedweb0.00NaN
        10021562023-01-02 07:58:46completedweb0.00NaN
        1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
        1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
        1005822023-01-02 11:43:36completedweb0.00WELCOME10
        order_items30,338 filas · 6 columnas
        • order_item_idinteger
        • order_idinteger
        • product_idinteger
        • quantityinteger
        • unit_pricedecimal
        • discount_pctdecimal
        Primeras 5 filas de order_items
        order_item_idorder_idproduct_idquantityunit_pricediscount_pct
        11001121931.990.00
        21001154311.990.00
        31002154411.990.00
        410021941149.000.00
        51002193219.990.00
        returns1,673 filas · 5 columnas
        • return_idinteger
        • order_item_idinteger
        • returned_ondate
        • reasonvarchar
        • refund_amountdecimal
        Primeras 5 filas de returns
        return_idorder_item_idreturned_onreasonrefund_amount
        1142023-01-10damaged83.69
        2422023-01-10wrong_item19.99
        31052023-01-14wrong_item10.99
        4242023-01-16changed_mind26.99
        51262023-01-16late20.99
        web_sessions40,000 filas · 7 columnas
        • session_idinteger
        • customer_idinteger
        • started_attimestamp
        • devicevarchar
        • sourcevarchar
        • pages_viewedinteger
        • convertedboolean
        Primeras 5 filas de web_sessions
        session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
        1NaN2023-01-01 23:02:24mobilepaid1false
        2182023-01-01 15:07:49desktoppaid1false
        3NaN2023-01-01 16:55:46desktopdirect7false
        4NaN2023-01-01 12:43:28mobileorganic3false
        5NaN2023-01-01 13:06:21mobilesocial2false
        marketing_spend3,276 filas · 3 columnas
        • spend_datedate
        • channelvarchar
        • amountdecimal
        Primeras 5 filas de marketing_spend
        spend_datechannelamount
        2023-01-01paid492.99
        2023-01-01email37.38
        2023-01-01social200.53
        2023-01-02paid709.13
        2023-01-02email64.13

        La lección

        Qué estás verificando y por qué

        Una exportación de RR. HH. se ve ordenada, pero a menudo se edita a mano: se vuelve a ingresar a las personas tras un cambio de puesto, los gerentes se van y sus reportes siguen apuntando a ellos. Antes de sumar nada, comprueba tres cosas.

        • ¿Alguien está listado dos veces? Los ids son únicos por diseño, así que cuenta también los nombres distintos.
        • ¿Cada línea de reporte lleva a algún sitio? Un manager_id que no coincide con ningún employee_id es un huérfano. Solo el CEO debe carecer de gerente.
        • ¿Son plausibles los salarios? min() y max() detectan una cifra mensual escrita como anual, o un cero faltante.

        La verificación de reportes necesita un automerge: la tabla unida con una copia de sí misma, un lado para el empleado y otro para el gerente. how="left" conserva a todos los empleados, e indicator=True agrega una columna _merge que dice si se encontró una fila de gerente:

        checked = e.merge(managers, how="left", left_on="manager_id", right_on="mgr_id", indicator=True)
        checked["_merge"].value_counts()   # both 59, left_only 1

        La única fila left_only es el CEO, cuyo manager_id falta. Un huérfano sería una fila left_only que sí tiene manager_id. Aquí no hay ninguna.

        Plantilla, nómina, media y mediana

        El paso 2 es un solo groupby con agregación con nombre. El par interesante es media y mediana. La media suma todos los salarios y divide; la mediana es el salario del medio cuando están ordenados. En un departamento de siete donde una persona es el responsable, el salario del responsable mueve mucho la media y apenas la mediana:

        department headcount mean_salary median_salary
        Engineering 8 149,750 139,500
        Data & Analytics 7 108,000 92,000
        Sales 9 84,000 73,000
        Customer Support 9 59,333 50,000

        Para “cuánto gana aquí una persona típica”, informa de la mediana. La nómina sigue siendo la suma: eso es lo que paga el presupuesto.

        Tramo de control

        El tramo de control es el número de personas que reportan directamente a un gerente. Es un insumo habitual del diseño organizativo: demasiado estrecho y la empresa es pesada en la cúpula, demasiado amplio y los gerentes no pueden con todo. Con un merge interno, cada fila es una línea de reporte, así que contar filas por gerente da el tramo. Conserva solo las columnas que necesitas en el lado izquierdo, o las dos columnas title chocan.

        manager_id es una columna float por el valor faltante del CEO. Al hacer merge con el entero mgr_id, 3.0 sigue coincidiendo con 3; pandas compara los valores, no los tipos.

        Los tramos aquí van de 2 (Anna Chen, Sales Manager) a 7. Los dos gerentes de Support tienen 5 y 3.

        Trampas

        • Un merge interno en la verificación oculta justo las filas que buscas.
        • Agrupar por nombre fusiona a dos gerentes que comparten uno; agrupa por id en una empresa grande.
        • Las medias departamentales de 2 o 5 personas pueden revelar salarios individuales. Mantenlas fuera de los informes que salgan de Finanzas y RR. HH.

        Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.