Вот два кадра данных
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»?





Я думаю, проблема в том, что ваши 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.