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.
You need to use iter_mut()
instead of iter()
to advance the iterators:
for iter in iters.iter_mut().zip(&columns) {
// ...
}