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))