Как анализировать и фильтровать строковый столбец в Rust Polars?

У меня есть 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"] }

Пожалуйста, опубликуйте полную ошибку из cargo check.

Chayim Friedman 23.06.2024 03:39

Какую версию поляра используете?

Chayim Friedman 23.06.2024 03:42

Вы используете устаревшую версию Polars (текущая версия 0.41.0). Обновите его.

Chayim Friedman 23.06.2024 03:44

Спасибо за предложение. Я установил последнюю сборку, но она не компилируется внутри поляров. 🙄 Так что мне придется подождать, пока это исправят, прежде чем я смогу опробовать новую версию приведенного выше кода.

Nick K9 23.06.2024 04:12

Я думаю, что они тестируют только без функций и со всеми функциями, поэтому подобные сбои вполне ожидаемы. Попробуйте использовать больше функций.

Chayim Friedman 23.06.2024 04:15
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
5
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует флаг функции 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 " анализируется, как я и надеялся.

Nick K9 23.06.2024 20:28

Другие вопросы по теме