有没有更快的方法把一个函数应用到每一行?
如果我们想在没有内置方法的情况下对每一行应用一个函数,例如 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。