极坐标“join_asof”具有重复的“by”值

问题描述 投票:0回答:1

这是两个数据框

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']})

执行以下操作,我希望

df1
df2
的第 3 行能够匹配,事实确实如此。但我还希望第 1 行和第 2 行分别与
df1
df2
的第 2 行和第 1 行匹配,因为 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"]})

但是

df1
的第 1 行和第 2 行都与
df2
的第 2 行匹配。上面这行代码实际上给了我:

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

我的困惑点以粗体显示 - 为什么这没有发生?这与“abc”组被重复有关系吗?

join merge python-polars
1个回答
0
投票

我认为问题是你的数据框没有排序,而文档

两个 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    │
└────────┴───────┴───────────┴───────┴──────┘
© www.soinside.com 2019 - 2024. All rights reserved.