有没有更快的方法把一个函数应用到每一行?

后端开发 2026-07-12

如果我们想在没有内置方法的情况下对每一行应用一个函数,例如 rank_horizontal,最快的方法是什么?

data = {0: [0, 1, 0, 1, 1, 0, 1, 0, 1, 1],
 1: [0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
 2: [0, 0, 1, 0, 1, 0, 1, 0, 0, 1],
 3: [0, 1, 0, 0, 1, 0, 0, 0, 1, 0],
 4: [0, 1, 1, 0, 1, 0, 0, 0, 1, 1]}
Input df (pandas):

   0  1  2  3  4
0  0  0  0  0  0
1  1  0  0  1  1
2  0  0  1  0  1
3  1  0  0  0  0
4  1  0  1  1  1
5  0  0  0  0  0
6  1  1  1  0  0
7  0  0  0  0  0
8  1  1  0  1  1
9  1  1  1  0  1

在pandas中,我们可以这样做:

df.rank(axis=1)

在polars中,这是一种做法。是否有更快的方法?

(df2.select(
    pl.concat_arr(
        pl.all()).arr.eval(pl.element().rank())
        )
    .with_row_index()
    .explode('0')
    .with_columns(
        pl.col('index').cum_count().sub(1).over('index').alias('cc')
        ).pivot(index = 'index',on = 'cc'))

输出:

     0    1    2    3    4
0  3.0  3.0  3.0  3.0  3.0
1  4.0  1.5  1.5  4.0  4.0
2  2.0  2.0  4.5  2.0  4.5
3  5.0  2.5  2.5  2.5  2.5
4  3.5  1.0  3.5  3.5  3.5
5  3.0  3.0  3.0  3.0  3.0
6  4.0  4.0  4.0  1.5  1.5
7  3.0  3.0  3.0  3.0  3.0
8  3.5  3.5  1.0  3.5  3.5
9  3.5  3.5  3.5  1.0  3.5

解决方案

你可以通过 .arr.to_struct() 将数组转换为一个结构体,然后再对其进行展开。

df.select(
    pl.concat_arr(pl.all()).arr.eval(pl.element().rank())
      .arr.to_struct()
)
# shape: (10, 1)
# ┌───────────────────────┐
# │ 0                     │
# │ ---                   │
# │ struct[5]             │
# ╞═══════════════════════╡
# │ {3.0,3.0,3.0,3.0,3.0} │
# │ {4.0,1.5,1.5,4.0,4.0} │
# │ {2.0,2.0,4.5,2.0,4.5} │
# │ {5.0,2.5,2.5,2.5,2.5} │
# │ {3.5,1.0,3.5,3.5,3.5} │
# │ {3.0,3.0,3.0,3.0,3.0} │
# │ {4.0,4.0,4.0,1.5,1.5} │
# │ {3.0,3.0,3.0,3.0,3.0} │
# │ {3.5,3.5,1.0,3.5,3.5} │
# │ {3.5,3.5,3.5,1.0,3.5} │
# └───────────────────────┘

你可以将原始列名作为 fields= 传入,以保留它们。

df.select(
    pl.concat_arr(pl.all()).arr.eval(pl.element().rank())
      .arr.to_struct(fields=df.columns)
).unnest(pl.all())
# shape: (10, 5)
# ┌─────┬─────┬─────┬─────┬─────┐
# │ 0   ┆ 1   ┆ 2   ┆ 3   ┆ 4   │
# │ --- ┆ --- ┆ --- ┆ --- ┆ --- │
# │ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
# ╞═════╪═════╪═════╪═════╪═════╡
# │ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 │
# │ 4.0 ┆ 1.5 ┆ 1.5 ┆ 4.0 ┆ 4.0 │
# │ 2.0 ┆ 2.0 ┆ 4.5 ┆ 2.0 ┆ 4.5 │
# │ 5.0 ┆ 2.5 ┆ 2.5 ┆ 2.5 ┆ 2.5 │
# │ 3.5 ┆ 1.0 ┆ 3.5 ┆ 3.5 ┆ 3.5 │
# │ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 │
# │ 4.0 ┆ 4.0 ┆ 4.0 ┆ 1.5 ┆ 1.5 │
# │ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 ┆ 3.0 │
# │ 3.5 ┆ 3.5 ┆ 1.0 ┆ 3.5 ┆ 3.5 │
# │ 3.5 ┆ 3.5 ┆ 3.5 ┆ 1.0 ┆ 3.5 │
# └─────┴─────┴─────┴─────┴─────┘
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章