1

你好;

是否有任何函数可以通过计算两个系列的行最小值来生成一个系列。?功能将类似于 np.minimum

a = [1,4,2,5,2] b= [5,1,4,2,5]

np.minimum(a,b) -> [1,1,2,2,2]

谢谢。

4

2 回答 2

2
q =df.lazy().with_column(pl.when(pl.col("a")>pl.col("b")).then(pl.col("b")).otherwise(pl.col("a")).alias("minimum"))

df = q.collect()

我没有测试过,但我认为这应该可以

于 2021-11-08T20:44:34.130 回答
2

正如接受的答案所述,您可以使用pl.when -> then -> otherwise表达式。

如果您有更宽的 DataFrame,则可以使用DataFrame.min()方法、pl.min表达式或 apl.fold来获得更多控制。

import polars as pl

df = pl.DataFrame({
    "a": [1,4,2,5,2],
    "b": [5,1,4,2,5],
    "c": [3,2,5,7,2]
})

df.min(axis=1)

这输出:

shape: (5,)
Series: 'a' [i64]
[
    1
    1
    2
    2
    2
]

最小表达式

当给定多个表达式输入时pl.min,最小值是按行而不是按列确定的。

df.select(pl.min(["a", "b", "c"]))

输出:

shape: (5, 1)
┌─────┐
│ min │
│ --- │
│ i64 │
╞═════╡
│ 1   │
├╌╌╌╌╌┤
│ 1   │
├╌╌╌╌╌┤
│ 2   │
├╌╌╌╌╌┤
│ 2   │
├╌╌╌╌╌┤
│ 2   │
└─────┘

折叠表达式

或者用一个fold表达式:

df.select(
    pl.fold(int(1e9), lambda acc, a: pl.when(acc > a).then(a).otherwise(acc), ["a", "b", "c"])
)
shape: (5, 1)
┌─────────┐
│ literal │
│ ---     │
│ i64     │
╞═════════╡
│ 1       │
├╌╌╌╌╌╌╌╌╌┤
│ 1       │
├╌╌╌╌╌╌╌╌╌┤
│ 2       │
├╌╌╌╌╌╌╌╌╌┤
│ 2       │
├╌╌╌╌╌╌╌╌╌┤
│ 2       │
└─────────┘

fold允许更酷的事情,因为您对表达式进行操作。

因此,我们可以例如计算min平方列的 :

pl.fold(int(1e9), lambda acc, a: pl.when(acc > a).then(a).otherwise(acc), [pl.all()**2])

或者我们可以计算列“a”的平方根的最小值,然后将其余列平方。

pl.fold(int(1e9), lambda acc, a: pl.when(acc > a).then(a).otherwise(acc), [pl.col("a").sqrt(), pl.all().exclude("a")**2])

你明白了。

于 2021-11-09T18:35:09.110 回答