Polars `join_asof` с повторяющимися значениями `by`

Вот два кадра данных

df1 = pl.DataFrame({'title1': ['abc', 'abc', 'def'], 
'year1': [2016, 2000, 1934]})

df2 = pl.DataFrame({'title2': ['abc', 'abc', 'def'], 
'director2': ['john', 'paul', 'peter'], 
'year2': [2001, 2018, 2016], 
'val2': ['A', 'B', 'C']})

Делая следующее, я ожидаю, что строка 3 из df1 и df2 будет совпадать, что и происходит. Но я также ожидаю, что строки 1 и 2 будут соответствовать строкам 2 и 1 из df1 и df2 соответственно, поскольку 2016 год ближе к 2018 году, а 2000 год ближе к 2001 году.

df1.join_asof(df2, left_on = 'year1', right_on = 'year2', by_left = ['title1'], by_right = ['title2'], strategy = 'nearest')

Чтобы внести ясность, я ожидал, что результат будет следующим:

pl.DataFrame({'title1': ["abc", "abc", "def"],
 'year1': [2016, 2000, 1934],
 'director2': ["paul", "john", "peter"],
 'year2': [2018, 2001, 2016],
 'val2': ["B", "A", "C"]})

Но строки 1 и 2 из df1 вместо этого совпадают со строкой 2 из df2. Приведенная выше строка кода фактически дает мне:

pl.DataFrame({'title1': ["abc", "abc", "def"],
 'year1': [2016, 2000, 1934],
 'director2': ["paul", "paul", "peter"],
 'year2': [2018, 2018, 2016],
 'val2': ["B", "B", "C"]})

Моя точка замешательства выделена жирным шрифтом - почему этого не происходит? Связано ли это как-то с дублированием группы «abc»?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, проблема в том, что ваши DataFrames не сортируются, хотя в документации сказано

Оба DataFrame должны быть отсортированы по ключу asof_join.

df1 = df1.sort('year1')
df2 = df2.sort('year2')

df1.join_asof(
    df2,
    left_on = 'year1',
    right_on = 'year2',
    by_left = ['title1'],
    by_right = ['title2'],
    strategy = 'nearest'
)

┌────────┬───────┬───────────┬───────┬──────┐
│ title1 ┆ year1 ┆ director2 ┆ year2 ┆ val2 │
│ ---    ┆ ---   ┆ ---       ┆ ---   ┆ ---  │
│ str    ┆ i64   ┆ str       ┆ i64   ┆ str  │
╞════════╪═══════╪═══════════╪═══════╪══════╡
│ def    ┆ 1934  ┆ peter     ┆ 2016  ┆ C    │
│ abc    ┆ 2000  ┆ john      ┆ 2001  ┆ A    │
│ abc    ┆ 2016  ┆ paul      ┆ 2018  ┆ B    │
└────────┴───────┴───────────┴───────┴──────┘

Интересно, если я создам сокращенный пример вашего варианта использования:

df1 = pl.DataFrame({'year1': [2016, 2000]})
df2 = pl.DataFrame({'year2': [2001, 2018]})

┌───────┐
│ year1 │
│ ---   │
│ i64   │
╞═══════╡
│ 2016  │
│ 2000  │
└───────┘

┌───────┐
│ year2 │
│ ---   │
│ i64   │
╞═══════╡
│ 2001  │
│ 2018  │
└───────┘

И попробую join_asof без сортировки, то получаю ошибку:

df1.join_asof(
    df2,
    left_on = 'year1',
    right_on = 'year2',
    strategy = 'nearest'
)

---------------------------------------------------------------------------
...
InvalidOperationError: argument in operation 'asof_join' is not explicitly sorted

- If your data is ALREADY sorted, set the sorted flag with: '.set_sorted()'.
- If your data is NOT sorted, sort the 'expr/series/column' first.

Я думаю, что поляры не проверяют (частичную) сортировку, когда присутствуют параметры by_left/by_right/by.

Другие вопросы по теме