polars-rows-iter 0.13.2

Library for easy and convenient row iteration of polars dataframes
Documentation
#![allow(dead_code)]

use polars::prelude::*;
use polars_rows_iter::*;

const ID: &str = "id";

#[derive(Debug, FromDataFrameRow)]
struct MyRow<'a> {
    #[column(ID)]
    id: i32,
    value_b: &'a str,
    value_c: String,
    optional: Option<f64>,
}

fn create_dataframe() -> PolarsResult<DataFrame> {
    df!(
        "id" => [1i32, 2, 3, 4, 5],
        "col_b" => ["a", "b", "c", "d", "e"],
        "col_c" => ["A", "B", "C", "D", "E"],
        "col_d" => [Some(1.0f64), None, None, Some(2.0), Some(3.0)]
    )
}

fn create_iterator(df: &DataFrame) -> PolarsResult<Box<dyn Iterator<Item = PolarsResult<MyRow<'_>>> + '_>> {
    let value_b_column_name = "col_b".to_string();
    let value_c_column_name = "col_c";

    let rows_iter: Box<dyn Iterator<Item = Result<MyRow<'_>, PolarsError>>> =
        df.rows_iter_with_columns::<MyRow>(|columns| {
            columns
                .value_b(&value_b_column_name)
                .value_c(value_c_column_name)
                .optional("col_d")
        })?;

    Ok(rows_iter)
}

fn run() -> PolarsResult<()> {
    let df = create_dataframe()?;

    let rows_iter = create_iterator(&df)?;

    for row in rows_iter {
        let row = row?;
        println!("{row:?}");
    }

    Ok(())
}

fn main() {
    run().unwrap()
}