考虑以下极坐标数据框:
>>> left = pl.DataFrame(pl.Series('a', [1,5,3,2]))
>>> left
shape: (4, 1)
┌─────┐
│ a │
│ --- │
│ i64 │
╞═════╡
│ 1 │
│ 5 │
│ 3 │
│ 2 │
└─────┘
>>> right = pl.DataFrame([pl.Series('a', [0,1,2,3]), pl.Series('b', [4,5,6,7])])
>>> right
shape: (4, 2)
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 0 ┆ 4 │
│ 1 ┆ 5 │
│ 2 ┆ 6 │
│ 3 ┆ 7 │
└─────┴─────┘
我想以这样的方式连接两者,即保留
a
数据帧中 left
值的顺序。左连接似乎可以做到这一点:
>>> left.join(right, on='a', how='left')
shape: (4, 2)
┌─────┬──────┐
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪══════╡
│ 1 ┆ 5 │
│ 5 ┆ null │
│ 3 ┆ 7 │
│ 2 ┆ 6 │
└─────┴──────┘
我的问题是:这种行为有保证吗?如果不是,那么安全的方法是什么?我可以使用
with_row_index
然后进行最终排序,但这似乎相当麻烦。在 pandas 中,这可以通过 reindex
方法简洁地完成。
左连接保证保留左数据帧的顺序,至少在常规引擎中是这样。对于流引擎,这可能无法保证。
如果您想“安全”,那么您已经有了正确的解决方法来添加行数并对其进行排序。
不,不保证订单得到保留。我最近遇到了它,并设法用一个小例子复制了该行为:
import polars as pl
import numpy as np
df1 = pl.DataFrame({'id': np.arange(100), 'foo': np.random.rand(100)})
df1.head()
这将显示
shape: (5, 2)
id foo
i64 f64
0 0.620648
1 0.81778
2 0.132117
3 0.07644
4 0.047929
现在让我们使用扰乱的 id 创建第二个数据框:
shuffled_id = np.random.choice(np.arange(100), 100, replace=False)
df2 = pl.DataFrame({'id': shuffled_id, 'bar': np.random.rand(100)})
df2.head()
其中包含
shape: (5, 2)
id bar
i64 f64
80 0.674931
71 0.166214
49 0.990646
24 0.82716
22 0.808711
现在让我们加入他们:
df1.join(df2, on='id')
现在的顺序既不是
df1
中的顺序,也不是df2
中的顺序:
shape: (100, 3)
id foo bar
i64 f64 f64
93 0.476374 0.147519
22 0.760892 0.499682
30 0.167688 0.221052
94 0.429656 0.389314
16 0.304306 0.469522
13 0.624806 0.003972
50 0.429345 0.268665
...