以下代码运行:
fn main() {
let mut df = df! [
"names" => ["a", "b", "c", "d"],
"values" => [1, 2, 3, 4],
"floats" => [1.25, 2., 1., 0.5]
].unwrap();
// println!("{:?}", df);
let names_to_remove = Series::new("bad names".into(), ["c", "d"]);
let df1 = df
.clone()
.lazy()
.filter(col("names").is_in(lit(names_to_remove)).not())
.collect()
.unwrap();
println!("{:?}", df1);
}
现在我尝试做同样的事情,但过滤列的名称发生了变化:
fn main() {
let mut df = df! [
"names" => ["a", "b", "c", "d"],
"values" => [1, 2, 3, 4],
"floats" => [1.25, 2., 1., 0.5]
].unwrap();
// println!("{:?}", df);
let old_name = &df.get_column_names_owned()[0]; // rename first column
let _ = df.rename(old_name, "all_names".into());
// println!("{:?}", df);
// println!("{:?}", df.column("all_names").unwrap());
let cols_to_remove = Series::new("bad names".into(), ["c", "d"]);
let df1 = df
.clone()
.lazy()
.filter(col("all_names").is_in(lit(cols_to_remove)).not())
.collect()
.unwrap();
println!("{:?}", df1);
}
这会导致出现错误消息:
thread 'main' panicked at src/main.rs:42:10:
called `Result::unwrap()` on an `Err` value: ColumnNotFound(ErrString("unable to find column \"all_names\"; valid columns: [\"names\", \"values\", \"floats\"]\n\nResolved plan until failure:\n\n\t---> FAILED HERE RESOLVING 'filter' <---\nDF [\"names\", \"values\", \"floats\"]; PROJECT */3 COLUMNS"))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
该消息似乎表明第一列名称没有改变,尽管打印数据框或甚至按其名字提取的第一列都表明名称确实已改变。
但是,使用旧的列名也不起作用(col("all_names")
--> col("names")
):
thread 'main' panicked at src/main.rs:43:10:
called `Result::unwrap()` on an `Err` value: ColumnNotFound(ErrString("\"names\" not found"))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
这是一个错误。相同的代码似乎在 版本 下运行良好
0.45.1
,但在 版本 下出现问题。我在发布页面中0.46
没有看到任何重大更改记录。我建议您在 Github 存储库中提出问题。一个解决方法是
rename
在 上运行LazyFrame
。以下解决方法使用过滤而不诉诸
lazy()
: