gpt4 book ai didi

dataframe - 如何在 Rust 中将函数应用于 polars DataFrame 的多列

转载 作者:行者123 更新时间:2023-12-02 18:10:56 24 4
gpt4 key购买 nike

我想将一个用户定义的函数应用到 Rust 中的 polars DataFrame 的某些列,该函数接受一些输入(对应于 polars DataFrame 中的某些列)。我正在使用的模式如下。我想知道这是最佳做法吗?

fn my_filter_func(col1: &Series, col2: &Series, col2: &Series) -> ReturnType {
let it = (0..n).map(|i| {
let col1 = match col.get(i) {
AnyValue::UInt64(val) => val,
_ => panic!("Wrong type of col1!"),
};
// similar for col2 and col3
// apply user-defined function to col1, col2 and col3
}
// convert it to a collection of the required type
}

最佳答案

您可以将 Series 向下转换为您想要迭代的正确类型,然后使用 Rust 迭代器来应用您的逻辑。

fn my_black_box_function(a: f32, b: f32) -> f32 {
// do something
a
}

fn apply_multiples(col_a: &Series, col_b: &Series) -> Float32Chunked {
match (col_a.dtype(), col_b.dtype()) {
(DataType::Float32, DataType::Float32) => {
let a = col_a.f32().unwrap();
let b = col_b.f32().unwrap();

a.into_iter()
.zip(b.into_iter())
.map(|(opt_a, opt_b)| match (opt_a, opt_b) {
(Some(a), Some(b)) => Some(my_black_box_function(a, b)),
_ => None,
})
.collect()
}
_ => panic!("unpexptected dtypes"),
}
}

惰性 API

您不必离开惰性 API 就可以访问 my_black_box_function

我们可以在 Struct 数据类型中收集我们想要应用的列,然后在该 Series 上应用闭包。

fn apply_multiples(lf: LazyFrame) -> Result<DataFrame> {
df![
"a" => [1.0, 2.0, 3.0],
"b" => [3.0, 5.1, 0.3]
]?
.lazy()
.select([concat_lst(["col_a", "col_b"]).map(
|s| {
let ca = s.struct_()?;

let b = ca.field_by_name("col_a")?;
let a = ca.field_by_name("col_b")?;
let a = a.f32()?;
let b = b.f32()?;

let out: Float32Chunked = a
.into_iter()
.zip(b.into_iter())
.map(|(opt_a, opt_b)| match (opt_a, opt_b) {
(Some(a), Some(b)) => Some(my_black_box_function(a, b)),
_ => None,
})
.collect();

Ok(out.into_series())
},
GetOutput::from_type(DataType::Float32),
)])
.collect()
}

关于dataframe - 如何在 Rust 中将函数应用于 polars DataFrame 的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72372821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com