1.5.2 Iterating
A series is a sequence, so for walks it directly, as Python’s for x in s does; in-series adds #:null. Rows are converted 4096 at a time, so the loop streams: it never holds the whole column’s buffer, and one that stops early converts little more than it reads. in-dataframe-columns walks a frame’s columns as series, as DataFrame.iter_columns() does.
> (for/list ([word (ref df "bar")]) (string-upcase word)) '("HAM" "SPAM" "JAM")
> (for/sum ([v (in-series gappy #:null 0)]) v) 4
> (for/first ([v (in-series (series (build-list 1000000 values)))] #:when (> v 41)) v) 42
> (for/list ([column (in-dataframe-columns df)]) (cons (series-name column) (dtype column))) '(("foo" . int64) ("bar" . string))
in-dataframe-rows walks a frame’s rows, as DataFrame.iter_rows() does: a vector per row, or with #:named? a hash from column name to value, as named=True gives a dict. It converts #:buffer-size rows at a time (512, as buffer_size), with one bulk copy per column, so it streams as in-series does. dataframe->rows is DataFrame.rows(): every row, in a list.
> (for/list ([row (in-dataframe-rows df)]) row) '(#(1 "ham") #(2 "spam") #(3 "jam"))
> (for/list ([row (in-dataframe-rows df #:named? #t)]) (hash-ref row "bar")) '("ham" "spam" "jam")
> (for/list ([row (in-dataframe-rows people #:columns '("name" "weight"))]) (define-values (name weight) (vector->values row)) (format "~a: ~a kg" name weight)) '("Alice Archer: 57.9 kg" "Ben Brown: 72.5 kg")
> (dataframe->rows df #:columns '("bar" "foo")) '(#("ham" 1) #("spam" 2) #("jam" 3))