try 从极点数据帧访问数据时,使用方括号[ ]
和使用Expression APIs(如select
、filter
等)有什么不同?什么时候用哪一种?
A极地数据帧
df = pl.DataFrame(
{
"a": ["a", "b", "a", "b", "b", "c"],
"b": [2, 1, 1, 3, 2, 1],
}
)
try 从极点数据帧访问数据时,使用方括号[ ]
和使用Expression APIs(如select
、filter
等)有什么不同?什么时候用哪一种?
A极地数据帧
df = pl.DataFrame(
{
"a": ["a", "b", "a", "b", "b", "c"],
"b": [2, 1, 1, 3, 2, 1],
}
)
通常,建议使用Polars Expression API,因为大多数方法都是Polars lazy API的一部分.API将许多操作(如 Select 、过滤和Mutations )的求值推迟到实际需要结果时才进行.这使得query optimizations可以让极点变得如此高效.
相比之下,使用方括号表示法访问列仅在Eager 模式下有效.
作为一个具体的例子,考虑读取一个相当大的.csv文件(~700mb)的第一个元素.我们首先创建.csv文件并将其写入磁盘.
import polars as pl
pl.DataFrame({"col": [0] * 100_000_000}).write_csv("df.csv")
Using square bracket notation (100).
由于方括号表示法在LazyFrames
上不起作用,我们需要使用pl.read_parquet
将文件读入DataFrame
对象.
pl.read_csv("df.csv")["col"][0]
在我的机器上,这大约需要200毫秒.
Using polars lazy API.
使用Polar Lazy API(pl.scan_csv
、select
、first
、item
)也可以实现同样的目的.
pl.scan_csv("df.csv").select("col").first().collect().item()
计算的延迟允许POLAR避免读取整个文件,并且在我的机器上执行仅占用300μS,即we obtained a ~650x speed-up by using polars' lazy API.
当然,人们可能会争辩说,通过避免读取整个.csv文件而不是使用select
而不是[
,可以节省大量时间.但是,请注意,这仍然是due to the benefits of the lazy API.