Unir DataFrames por condición o coincidencia más cercana

Transformación de datos con Polars

Liam Brannigan

Data Scientist & Polars Contributor

Unir con una condición

Una sola tabla que muestra ganadores de la Copa del Mundo

Transformación de datos con Polars

Unir con una condición

Una tabla con ganadores de la Copa del Mundo y otra con victorias mínimas para categorías plata y oro.

Transformación de datos con Polars

Unir con una condición

Una tabla con ganadores de la Copa del Mundo, otra con niveles y una tabla unida de ganadores y los niveles logrados

Transformación de datos con Polars

Unir con una condición

Una tabla con ganadores de la Copa del Mundo, otra con niveles y una tabla unida de ganadores y los niveles logrados, con dos filas de Brasil resaltadas.

Transformación de datos con Polars

Usuarios de la app con preferencias

restaurants = pl.read_csv("restuarants.csv")
shape: (4, 5)
| business        | location    | review | price | type       |
| ---             | ---         | ---    | ---   | ---        |
| str             | str         | f64    | i64   | str        |
|-----------------|-------------|--------|-------|------------|
| 7burgers        | Wakey Wakey | 4.2    | 15    | restaurante |
| Costa Coffee    | City Point  | 4.5    | 8     | café       |
| Costa Coffee    | Waterloo    | 4.1    | 8     | café       |
| The Queens Head | Denman St.  | 4.7    | 25    | bar        |
Transformación de datos con Polars

La tabla de usuarios

users = pl.read_csv("app_users.csv")
shape: (3, 3)
| user_name | budget | type       |
| ---       | ---    | ---        |
| str       | i64    | str        |
|-----------|--------|------------|
| Bob       | 12     | café       |
| Alice     | 15     | restaurante |
| Charlie   | 22     | bar        |
Transformación de datos con Polars

Unir con una condición

restaurants.join_where(


)
Transformación de datos con Polars

Unir con una condición

restaurants.join_where(
    users,

)
Transformación de datos con Polars

Unir con una condición

restaurants.join_where(
    users,
    pl.col("type") == pl.col("type_right")
)
Transformación de datos con Polars

Unir con una condición

restaurants.join_where(
    users,
    pl.col("type") == pl.col("type_right")
)
shape: (4, 8)
| business        | type       | ... | user_name | budget |
| ---             | ---        | ... | ---       | ---    |
| str             | str        | ... | str       | i64    |
|-----------------|------------|-----|-----------|--------|
| 7burgers        | restaurante | ... | Alice     | 15     |
| Costa Coffee    | café       | ... | Bob       | 12     |
| Costa Coffee    | café       | ... | Bob       | 12     |
| The Queens Head | bar        | ... | Charlie   | 22     |
Transformación de datos con Polars

Unir con múltiples condiciones

restaurants.join_where(
    users,
    pl.col("type") == pl.col("type_right"),
    pl.col("price") <= pl.col("budget")
)
shape: (3, 8)
| user_name | budget | business     | price | type       | ... |
| ---       | ---    | ---          | ---   | ---        | ... |
| str       | i64    | str          | i64   | str        | ... |
|-----------|--------|--------------|-------|------------|-----|
| Alice     | 15     | 7burgers     | 15    | restaurante | ... |
| Bob       | 12     | Costa Coffee | 8     | café       | ... |
| Bob       | 12     | Costa Coffee | 8     | café       | ... |
Transformación de datos con Polars

Unir con valores más recientes

shape: (4, 3)
| business | date        | rating |
| ---      | ---         | ---    |
| str      | date        | i64    |
|----------|-------------|--------|
| 7burgers | 2025-03-15  | 5      |
| 7burgers | 2025-06-20  | 3      |
| 7burgers | 2025-09-10  | 4      |
| 7burgers | 2025-11-25  | 5      |

$$

  • Tarea: emparejar cada reseña con la inspección más relevante
shape: (3, 4)
| user   | business | date       | score |
| ---    | ---      | ---        | ---   |
| str    | str      | date       | f64   |
|--------|----------|------------|-------|
| Charlie | 7burgers | 2025-05-01 | 3.8   |
| Bob     | 7burgers | 2025-08-01 | 4.2   |
| Alice   | 7burgers | 2025-12-01 | 4.5   |
Transformación de datos con Polars

Unir con valores más recientes

reviews.sort("date").join_asof(



)

$$

$$

$$

$$

  • join_asof: unir a fecha determinada
Transformación de datos con Polars

Unir con valores más recientes

reviews.sort("date").join_asof(
    inspections.sort("date"),


)
Transformación de datos con Polars

Unir con valores más recientes

reviews.sort("date").join_asof(
    inspections.sort("date"),
    on="date",

)
Transformación de datos con Polars

Unir con valores más recientes

reviews.sort("date").join_asof(
    inspections.sort("date"),
    on="date",
    strategy="backward"
)
| user    | date       | score | ... | rating |
| ---     | ---        | ---   | ... | ---    |
| str     | date       | f64   | ... | i64    |
|---------|------------|-------|-----|--------|
| Charlie | 2025-05-01 | 3.8   | ... | 5      |
| Bob     | 2025-08-01 | 4.2   | ... | 3      |
| Alice   | 2025-12-01 | 4.5   | ... | 5      |
Transformación de datos con Polars

Unir por valor más cercano

reviews.sort("date").join_asof(
    inspections.sort("date"),
    on="date",
    strategy="nearest"
)
| user    | date       | score | ... | rating |
| ---     | ---        | ---   | ... | ---    |
| str     | date       | f64   | ... | i64    |
|---------|------------|-------|-----|--------|
| Charlie | 2025-05-01 | 3.8   | ... | 5      |
| Bob     | 2025-08-01 | 4.2   | ... | 4      |
| Alice   | 2025-12-01 | 4.5   | ... | 5      |
Transformación de datos con Polars

Elegir una estrategia

$$

Diagrama con dos tablas de series temporales, cada una con dos filas.

Transformación de datos con Polars

Elegir estrategia: backward

$$

Diagrama con dos tablas de series temporales con flechas que relacionan ambas filas de la izquierda con la primera fila de la derecha.

Transformación de datos con Polars

Elegir estrategia: nearest

$$

Diagrama con dos tablas de series temporales con flechas que relacionan cada fila de la izquierda con la fila correspondiente de la derecha.

Transformación de datos con Polars

Elegir estrategia: forward

$$

Diagrama con dos tablas de series temporales con flechas que relacionan ambas filas de la izquierda con la segunda fila de la derecha.

Transformación de datos con Polars

Emparejar dentro de grupos

reviews.sort("date").join_asof(
    restaurants.sort("date"),
    on="date",

by=["business", "location"]
)
| user    | business        | location    | date       | score | ... | rating |
| ---     | ---             | ---         | ---        | ---   | ... | ---    |
| str     | str             | str         | date       | f64   | ... | i64    |
|---------|-----------------|-------------|------------|-------|-----|--------|
| Charlie | 7burgers        | Wakey Wakey | 2025-05-01 | 3.8   | ... | null   |
| Bob     | Costa Coffee    | City Point  | 2025-05-01 | 4.0   | ... | 5      |
| Bob     | 7burgers        | Wakey Wakey | 2025-08-01 | 4.2   | ... | null   |
| Alice   | 7burgers        | Wakey Wakey | 2025-12-01 | 4.5   | ... | 4      |
| Alice   | The Queens Head | Denman St.  | 2025-12-01 | 4.7   | ... | 5      |
Transformación de datos con Polars

¡Vamos a practicar!

Transformación de datos con Polars

Preparing Video For Download...