У меня есть DataFrame со строковым столбцом, который выглядит следующим образом:
let df = df!(
"names" => &["None", "0", "1", "15", "1|2", "5 ??", "293 ", "XX"]);
Я хочу отфильтровать это до тех строк, которые представляют собой одно целое число (несколько цифр в порядке), где это целое число больше 0. Я также хочу удалить начальные и конечные пробелы, если parse()
не сделает это за меня. (Ни одно из чисел не будет очень большим, не более 3000). В приведенном выше случае индексы, проходящие через фильтр, будут 2, 3 и 6.
Я нашел другой ответ , но в нем нет того, что мне нужно. На странице фильтрации руководства пользователя Polars показаны только очень простые случаи. Возможно, я не нашел нужную страницу документации?
Это успешно удаляет все «0», но я не хочу исключать вещи один за другим:
let filtered = df
.lazy()
.filter(col("names").neq(lit("0")))
.collect()?;
println!("filtered: {}", filtered);
Заранее спасибо!
Обновление: похоже, я хочу создать новый столбец, приведя строку к целочисленному столбцу, предположительно также используя CastOptions::NonStrict. Но я не могу понять, как это сделать… Когда я пытаюсь использовать перечисление CastOptions
, компилятор жалуется, что оно закрытое?? Кроме того, я получаю сообщение об ошибке «метод с именем cast_with_options
не найден для перечисления Expr
в текущей области» при вызове, следующем за col("names")
, но это именно то, что документы делают с простым cast()
, так что я сейчас очень запутался. Нижеследующее пока НЕ РАБОТАЕТ.
use polars::chunked_array::cast::CastOptions; // Error
// ...
let out = df
.clone()
.lazy()
.select([col("names")
.cast_with_options(DataType::UInt16, CastOptions::NonStrict) // Error
.alias("int_names")])
.collect()?;
println!("post-cast: {}", out);
Обновление 2: Вот полные ошибки:
1 error[E0603]: struct `CastOptions` is private
--> rust/orphaned_splits.rs:5:34
|
5 | use polars::chunked_array::cast::CastOptions;
| ^^^^^^^^^^^ private struct
|
note: the struct `CastOptions` is defined here
--> /Users/nick/.cargo/registry/src/index.crates.io-6f17d22bba15001f/polars-core-0.38.3/src/chunked_array/cast.rs:3:5
|
3 | use arrow::compute::cast::CastOptions;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: import `CastOptions` directly
|
5 | use polars_arrow::compute::cast::CastOptions;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 error[E0599]: no method named `cast_with_options` found for enum `Expr` in the current scope
--> rust/orphaned_splits.rs:151:14
|
150 | .select([col("names")
| __________________-
151 | | .cast_with_options(DataType::UInt16, CastOptions::NonStrict)
| |_____________-^^^^^^^^^^^^^^^^^
|
help: there is a method `over_with_options` with a similar name
|
151 | .over_with_options(DataType::UInt16, CastOptions::NonStrict)
| ~~~~~~~~~~~~~~~~~
Обновление 3: Вот зависимость:
polars = { version = "0.38.3", features = ["parquet", "lazy", "dtype-categorical", "dtype-i16"] }
Какую версию поляра используете?
Вы используете устаревшую версию Polars (текущая версия 0.41.0). Обновите его.
Спасибо за предложение. Я установил последнюю сборку, но она не компилируется внутри поляров. 🙄 Так что мне придется подождать, пока это исправят, прежде чем я смогу опробовать новую версию приведенного выше кода.
Я думаю, что они тестируют только без функций и со всеми функциями, поэтому подобные сбои вполне ожидаемы. Попробуйте использовать больше функций.
Существует флаг функции string_to_integer
, который позволяет анализировать целые числа из строк с помощью:
use polars::{lazy::dsl::is_not_null, prelude::*};
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let df = df!(
"names" => &["None", "0", "1", "15", "1|2", "5 ??", "293 ", "XX"])?
.lazy()
.select([col("names")
.str()
.to_integer(lit("10"), false)
.alias("parsed_int")])
.filter(is_not_null(col("parsed_int")).and(col("parsed_int").gt(lit(0))))
.collect()?;
println!("{df}");
// shape: (2, 1)
// ┌────────────┐
// │ parsed_int │
// │ --- │
// │ i64 │
// ╞════════════╡
// │ 1 │
// │ 15 │
// └────────────┘
Ok(())
}
Вот мой cargo.toml
(пришлось добавить некоторые дополнительные функции, чтобы избежать ошибок компиляции):
[dependencies]
polars = { version = "0.41.0", features = [
"lazy",
"parquet",
"regex",
"string_to_integer",
"strings",
], git = "https://github.com/pola-rs/polars" }
Большое спасибо, это отлично работает. Я заменил with_columns()
, потому что мне нужны и остальные столбцы, и обнаружил, что вы можете использовать lit(10)
в качестве основы без кавычек. Кроме того, "293 "
анализируется, как я и надеялся.
Пожалуйста, опубликуйте полную ошибку из
cargo check
.