0

The code is:

fn iter_and_make_feature_dataframe(df: &DataFrame) {
    // iter over rows
    // let columns = columns.unwrap_or(vec![]);
    let col_len = df.shape().1;
    let columns = df.get_column_names();

    let mut df = df.clone();
    df.as_single_chunk();

    let mut iters = df.iter().map(|s| s.iter()).collect::<Vec<_>>();

    let mut row: Vec<Vec<String>> = Vec::new();
    for row_idx in 0..df.height() {
        let mut c_row: Vec<String> = Vec::new();
        for iter in &mut iters.iter().zip(&columns) {
            let (value_iter, col_name) = iter;
            let value = value_iter
                .next()
                .expect("should have as many iterations as rows")
                .to_string();
            c_row.push(value);
        }

        // process row
    }
}

rust analyzer said :

error[E0596]: cannot borrow `*value_iter` as mutable, as it is behind a `&` reference
  --> src/main.rs:24:25
   |
23 |               let (value_iter, col_name) = iter;
   |                    ---------- consider changing this binding's type to be: `&mut SeriesIter<'_>`
24 |               let value = value_iter
   |  _________________________^
25 | |                 .next()
   | |_______________________^ `value_iter` is a `&` reference, so the data it refers to cannot be borrowed as mutable

How can I fix this? I want to process a dataframe row by row and make a new dataframe with the processed rows.

Chayim Friedman
  • 47,971
  • 5
  • 48
  • 77
Crispy13
  • 230
  • 1
  • 3
  • 16
  • 2
    First, run `cargo check` and if it suggests changes, do what it says. If you're still stuck, then post the whole error from `cargo check`. – drewtato Jul 06 '23 at 02:04

1 Answers1

4

You need to use iter_mut() instead of iter() to advance the iterators:

for iter in iters.iter_mut().zip(&columns) {
    // ...
}
Chayim Friedman
  • 47,971
  • 5
  • 48
  • 77