Virtual views over columnar data. No copies until you ask for them.
Every filter flips bits — not rows. Every chain shares the same base DataFrame.
One bit per row, packed into 64-bit words. Filters AND their bitmasks together. No row data is ever copied during filtering.
1M rows = ~122 KBselect() narrows an index of visible column positions. Column data stays untouched — only the map of which columns you see changes.
O(ncols) memoryarrange() stores a sort permutation without reordering data. Only when you call materialize() does the concrete sorted DataFrame get built.
Zero-copy until neededColumnar predicates scan typed vectors word-at-a-time. Chained filters AND their bitmasks — no intermediate DataFrames created.
Every view in a chain holds a reference-counted pointer to the same base data. Memory grows by the bitmask size, not the data size.
Sum, mean, variance, standard deviation — all use compensated accumulation. No floating-point drift even over millions of values.
Every grouping, every join index uses BTreeMap/BTreeSet for deterministic iteration order. Same input = bit-identical output.