La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
Asigna a result un DataFrame con los 10 productos con mayor unit_price, con las columnas name, category, unit_price, ordenados por unit_price descendente y luego por name ascendente, con el índice reiniciado de 0 a 9.
- Usa el DataFrame
productspendiente - Muestra exactamente
namecategoryunit_pricependiente - 10 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Thomas, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
sort_values
sort_values ordena las filas de un DataFrame por una o más columnas:
products.sort_values("unit_price") # cheapest first
products.sort_values("unit_price", ascending=False) # most expensive first
Como la mayoría de los métodos de pandas, devuelve un DataFrame nuevo y deja products como estaba.
Varias columnas, varias direcciones
Pasa una lista de columnas para ordenar por la primera y luego, dentro de los empates, por la segunda, y
así sucesivamente. ascending también puede ser una lista, con una entrada por columna:
products.sort_values(["unit_price", "name"], ascending=[False, True])
Esto se lee: primero el precio más alto; entre productos con el mismo precio, de la A a la Z por nombre. Los empates son comunes: muchos productos cuestan $189 o $159. Sin un desempate, su orden depende de cómo se almacenaron las filas, así que dos ejecuciones con exportaciones ligeramente distintas podrían dar dos listas de los «10 mejores» distintas. Añade un desempate siempre que ordenes para un top-N, y usa una columna única (un nombre o un ID) como última clave para que el orden quede totalmente determinado.
Top N
Ordena y luego toma las primeras filas:
top10 = products.sort_values(["unit_price", "name"], ascending=[False, True]).head(10)
pandas también tiene products.nlargest(10, "unit_price"), que es rápido y eficiente. Ten en cuenta que
mantiene los empates en su orden original en lugar de dejarte elegir un desempate, así que para informes
donde el orden debe ser explícito, sort_values es más seguro.
Reinicia el índice para presentar
Después de ordenar, las etiquetas del índice siguen unidas a sus filas originales: el producto más caro podría tener la etiqueta 0, el siguiente la 17 y luego la 14. Para un ranking, la gente espera un índice limpio de 0 a 9:
top10.reset_index(drop=True)
drop=True tira las etiquetas antiguas. Sin él, se convierten en una columna nueva llamada index.
Encadenar métodos
Varios pasos escritos como una cadena, envueltos entre paréntesis para poder poner un paso por línea, se leen de arriba abajo como una receta:
result = (
products
.sort_values(["unit_price", "name"], ascending=[False, True])
.head(10)
[["name", "category", "unit_price"]]
.reset_index(drop=True)
)
Seleccionar las columnas antes o después de head da el mismo resultado; solo asegúrate de ordenar por
columnas que sigan ahí.
Ordenar texto y valores que faltan
El texto se ordena alfabéticamente, con las mayúsculas antes que las minúsculas ("Zebra" antes que
"apple"), una razón más para limpiar primero las mayúsculas y minúsculas. Los valores que faltan van al
final por defecto, sea cual sea la dirección; na_position="first" lo cambia.
Errores comunes
- Usar
ascending=Falsesolo con dos columnas, lo que ordena también los nombres de la Z a la A. - Tomar
.head(10)antes de ordenar, lo que da las diez primeras filas de la tabla, no los diez mejores. - Olvidar
drop=Trueenreset_indexy obtener una columnaindexde más.
¡Linterna encendida!
Practicaste: sort valuesascendingtie breakingheadreset index
- Resuelto
- Sin pistas
- Al primer intento
