Polars noob,给定一个m x n Polars的标量矩阵df和一个1 x n Polars的标量矩阵,我想把df中的每一列除以另一帧中的相应标量.

import numpy as np
import polars as pl

cols = list('abc')
df = pl.DataFrame(np.linspace(1, 9, 9).reshape(3, 3),
                  schema=cols)
scalars = pl.DataFrame(np.linspace(1, 3, 3)[:, None],
                       schema=cols)
In [13]: df
Out[13]: 
shape: (3, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 │
╞═════╪═════╪═════╡
│ 1.0 ┆ 2.0 ┆ 3.0 │
│ 4.0 ┆ 5.0 ┆ 6.0 │
│ 7.0 ┆ 8.0 ┆ 9.0 │
└─────┴─────┴─────┘

In [14]: scalars
Out[14]: 
shape: (1, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 │
╞═════╪═════╪═════╡
│ 1.0 ┆ 2.0 ┆ 3.0 │
└─────┴─────┴─────┘

我可以很容易地在Pandas中完成这一点,如下所示,通过委派给NumPy广播,但我想知道什么是最好的方式来做到这一点,而不需要来回之间的Polars/Pandas代表.

In [16]: df.to_pandas() / scalars.to_numpy()
Out[16]: 
     a    b    c
0  1.0  1.0  1.0
1  4.0  2.5  2.0
2  7.0  4.0  3.0

我找到了this similar question,其中标量常数已经是原始帧中的一行,但不知道如何利用another帧中的一行.

目前为止我能想出的最好的办法就是把帧组合起来做一些...讨厌的东西:D

In [31]: (pl.concat([df, scalars])
    ...:    .with_columns(pl.all() / pl.all().tail(1))
    ...:    .head(-1))
Out[31]: 
shape: (3, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 │
╞═════╪═════╪═════╡
│ 1.0 ┆ 1.0 ┆ 1.0 │
│ 4.0 ┆ 2.5 ┆ 2.0 │
│ 7.0 ┆ 4.0 ┆ 3.0 │
└─────┴─────┴─────┘

推荐答案

我认为你找到了一个非常独特/有趣和聪明的解决方案.也考虑只迭代列:

df.select(column / scalars[column.name] f或 column in df.iter_columns())

df.select(pl.col(k) / scalars[k] f或 k in df.columns)

df.with_columns(pl.col(k).truediv(scalars[k]) f或 k in df.columns)

Python相关问答推荐

如何使用symy打印方程?

Pystata:从Python并行运行stata实例

根据在同一数据框中的查找向数据框添加值

如何在箱形图中添加绘制线的传奇?

如何从具有不同len的列表字典中创建摘要表?

计算组中唯一值的数量

在vscode上使用Python虚拟环境时((env))

转换为浮点,pandas字符串列,混合千和十进制分隔符

当点击tkinter菜单而不是菜单选项时,如何执行命令?

如何在TensorFlow中分类多个类

Python Pandas—时间序列—时间戳缺失时间精确在00:00

Pandas:填充行并删除重复项,但保留不同的值

如何在Python中使用Iscolc迭代器实现观察者模式?

如何在GEKKO中使用复共轭物

用fft计算指数复和代替求和来模拟衍射?

查找查找表中存在的列值组合

启动线程时,Python键盘模块冻结/不工作

时长超过24小时如何从Excel导入时长数据

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

Python:使用asyncio.StreamReader.readline()读取长行