import polars as pl
df = pl.DataFrame(
{
"X": [4, 2, 3, 4],
"Y": ["p", "p", "p", "p"],
"Z": ["b", "b", "b", "b"],
}
)
我们知道 pandas 的
df.drop_duplicates()
相当于 python-polars 中的 df.unique()
但是,每次执行查询时都会得到不同的结果?
print(df.unique())
X Y Z
i64 str str
3 "p" "b"
2 "p" "b"
4 "p" "b"
X Y Z
i64 str str
4 "p" "b"
2 "p" "b"
3 "p" "b"
X Y Z
i64 str str
2 "p" "b"
3 "p" "b"
4 "p" "b"
这是故意的吗?背后的原因是什么?
如果您需要一致的行为,请执行以下操作:
df.unique(maintain_order=True)
维持订单
保持与原始DataFrame相同的顺序。这计算起来更加昂贵。将其设置为 True 会阻止在流引擎上运行的可能性。
维护顺序对流不友好,因为它需要将内存中的所有块放在一起来比较行的顺序。
通过默认设置的更改,开发人员希望确保 Polars 准备好处理各种大小的数据集,同时允许用户根据需要选择不同的行为。
一个相关点是通过
unique
选择保留每个重复组中的哪一行。在 Pandas 中,这默认为每个重复组的第一行。在 Polars 中,默认值为 any
,因为这再次允许更多优化。
具有此行为的其他函数包括:
1.
group_by
(maintain_order:bool = False)
2.
partition_by
(maintain_order:bool = True)
3.
pivot
(maintain_order:bool = True)
4.
upsample
(maintain_order:bool = False)
@LiamBrannigan 的详细文章:https://www.rhosignal.com/posts/polars-ordering/