极坐标是否保留左连接中的行顺序?

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

考虑以下极坐标数据框:

>>> 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
方法简洁地完成。

python join python-polars
2个回答
1
投票

左连接保证保留左数据帧的顺序,至少在常规引擎中是这样。对于流引擎,这可能无法保证。

如果您想“安全”,那么您已经有了正确的解决方法来添加行数并对其进行排序。


1
投票

不,不保证订单得到保留。我最近遇到了它,并设法用一个小例子复制了该行为:

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
...
© www.soinside.com 2019 - 2024. All rights reserved.