以下代码运行:
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