首页 > 其他分享 >从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力

从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力

时间:2024-07-21 09:57:46浏览次数:15  
标签:set 二十三 df sorted Polars 排序 数据 Pandas

Polars针对处理已排序的数据进行了优化。

要访问这些优化,你需要使用set_sorted标志告诉Polars数据已经排序。

set_sorted 主要用于以下两种情况:

  1. 标记单个或多个列已排序:当你知道 DataFrame 的某个或某些列是按升序或降序排列时,你可以使用 set_sorted 来标记这些列。这将告诉 Polars 这些列的排序状态,从而使其在执行查询时能够选择更有效的算法。

  2. 在 Lazy 模式下使用:在 Polars 的 Lazy 模式中,set_sorted 可以在执行计划生成阶段提供额外的信息,这有助于优化器选择更高效的执行路径。

调用方式

set_sorted 可以以多种方式调用:

  • 标记单个列已排序

    df = df.with_columns(pl.col("column_name").set_sorted())
  • 标记单个列已排序并指定排序方向

    df = df.with_columns(pl.col("column_name").set_sorted(ascending=True))

    这里,ascending 参数指定了列是升序还是降序排列。

  • 标记多个列已排序

    df = df.with_columns(
        [
            pl.col("column1").set_sorted(),
            pl.col("column2").set_sorted(),
            ...
        ]
    )

在下面这个简单的例子中,当我们告诉Polars序列已排序时,我们找到中位数的速度提高了1500倍。

# 创建一个有一千万个条目的series 
s = pl.Series("a", range(0,int(1e7)))

# 调用没有设置set_sorted 的.median
s.median()
# 耗时: 0.3 s

# 调用设置了set_sorted 的.median
s.set_sorted().median()
# 耗时: 0.0002 s

显然,使用 set_sorted 后可以显著提升某些操作的性能,特别是涉及到以下操作时:

  • 二分查找:Polars 可以使用二分查找算法,这在大型数据集上比线性查找快得多。
  • 分组和聚合:如果分组键已排序,Polars 可以使用更高效的算法进行分组和聚合操作。
  • 窗口函数:对于基于排序的窗口函数(如 rankcumsumcummean 等),如果数据已排序,Polars 可以避免不必要的排序步骤。

另外,使用set_sorted时,应注意以下几点:

  • 数据一致性:使用 set_sorted 前,请确保数据实际上已按你声明的方式排序。如果数据未排序,Polars 的行为可能不可预测,甚至可能导致错误结果。
  • 仅限于已排序数据set_sorted 不会对数据进行排序,它只是一种声明,告知 Polars 数据是已排序的。
  • Lazy 模式下的优化:在 Lazy 模式下使用 set_sorted,可以触发更深层次的优化,因为Polars的查询优化器能够利用这些信息来优化执行计划。

你可能已经在不知不觉中利用了set_sorted。如果你在操作中隐式或显式地对数据进行了排序,Polars会自动应用set_sorted。

set_sorted也适用于其他操作——在我的一些工作流程中,对Polars知道已排序的列进行大型数据集的groupby操作,速度提高了40%。

标签:set,二十三,df,sorted,Polars,排序,数据,Pandas
From: https://blog.csdn.net/sosogod/article/details/140506479

相关文章

  • pandas.parser.CParserError:标记数据时出错
    我正在尝试使用pandas操作.csv文件,但收到此错误:pandas.parser.CParserError:标记数据时出错。C错误:第3行应有2个字段,看到12我尝试阅读pandas文档,但什么也没找到。我的代码很简单:path='GOOGKeyRatios.csv'#print(open(path).read())data=p......
  • Python Pandas - 读取 CSV 或 Excel
    我允许用户上传CSV或Excel文件。我正在使用pandas读取文件并创建数据框。由于我无法预测用户将上传哪种文件类型,因此我将pd.read_csv()和pd.read_excel()包装在try/except块中。ifform.validate_on_submit():input_filename=secure_filename(form.file.da......
  • 具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误
    我有一个非常大的SAS文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用pandas中chunksize方法的read_sas选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。此特定SAS文件有794......
  • Pandas 哈希表给出 key error:0 和 get_item
    我试图获取两个pandas数据表的相同元素,对数据进行索引并将其合并。我将它用于大量数据(数百万)。第一个表(df)是恒定的,第二个表(d2)在每个循环中都在变化,新元素将与第一个表合并。这是我的此过程的代码:df=pd.read_csv("inputfile.csv",header=None)d1=pd.DataFram......
  • 如何填充用 geopandas 溶解地理数据框时创建的多多边形中的孔?
    我的目标是绘制MSOA(英国的连续地理单位)集群的边界,为此我从此处下载了MSOA边界的shapefile。然后,我添加一列簇标签并使用geopandas进行溶解。df.dissolve(by='label',aggfunc='sum')当我使用Folium绘制时,有多个内孔,如附图所示。我该如何删除这些?#create......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 使用 Polars 表达式将“eval()”应用于列
    我想通过Polars表达式实现以下目标,而不是逐行映射元素,但我一直无法找到方法。importpolarsdeffoo():return1+1defbar():return1+1defbaz():return2+2exprs=1_000_000*["foo()==bar()","bar()==baz()","foo()==......
  • pandas 数据框单元格中的列表
    如果我们有一个(更大的)数据框,显示旅行中个人(行)访问的状态:df=pd.DataFrame({'states_visited':[['NY','CA'],'CA','CA']},index=['John','Mary','Joe'])states_visitedJohn[NY,CA]......
  • Pandas 数据框中的排列总和呈超指数增长
    我有一个看起来像importpandasaspddata={"Race_ID":[2,2,2,2,2,5,5,5,5,5,5],"Student_ID":[1,2,3,4,5,9,10,2,3,6,5],"theta":[8,9,2,12,4,5,30,3,2,1,50]}df=pd.DataFrame(data)的pandas数据框,我想通过以下方法创建一个新列df[�......
  • Pandas学习笔记
    数据载入及初步观察1第一章:数据加载1.1载入数据数据集下载https://www.kaggle.com/c/titanic/overview1.1.1任务一:导入numpy和pandasimportnumpyasnpimportpandasaspdimportosasos【提示】如果加载失败,学会如何在你的python环境下安装numpy和pandas这两个库......