Sometimes the best release is the one that changes nothing you can see — and everything about how the build holds together.
Today we also released PandRS 0.3.2 — a same-day housekeeping patch on the heels of 0.3.1.
0.3.1 did the heavy lifting: a Pure Rust Excel path and a full sweep of -sys dependencies, keeping the DataFrame layer of the COOLJAPAN stack free of C and Fortran baggage. 0.3.2 doesn’t touch the public API at all. It makes the workspace itself cleaner so those wins are easier to reproduce.
Why 0.3.2 matters
A DataFrame crate with Python bindings has two manifests that have to agree on dozens of dependency versions. Drift between them is how subtle, hard-to-reproduce build problems start.
0.3.2 fixes that at the root. The top-level Cargo.toml is now a Cargo virtual workspace, with the common dependency set (~55 entries) hoisted into [workspace.dependencies]. Subcrates pull versions from one place via *.workspace = true, and the py_bindings subcrate now inherits version, authors, edition, license, and related metadata straight from the workspace root. The Pure Rust feature pins for datafusion, arrow, and parquet (the flate2-zlib-rs backend) are documented inline where they’re declared, so the reason a pin exists lives next to the pin. The result is a single source of truth for versions, more reproducible builds, and a tidier tree — 134 stale *.backup2 files are gone, with .gitignore patterns added so they don’t come back.
Getting Started
cargo add pandrs
use pandrs::{DataFrame, Series};
fn main() -> pandrs::error::Result<()> {
let mut df = DataFrame::new();
df.add_column(
"name".to_string(),
Series::from_vec(vec!["Alice", "Bob"], Some("name")),
)?;
df.add_column(
"score".to_string(),
Series::from_vec(vec![91.5, 88.0], Some("score")),
)?;
// Nothing in your code changes in 0.3.2 — same public API, tighter build
println!("{} rows", df.shape().0);
Ok(())
}
There is no migration. The public API is identical to 0.3.1 — this is a drop-in patch.
What’s New in 0.3.2
- Root
Cargo.tomlconverted to a Cargo virtual workspace with ~55 common dependencies hoisted into[workspace.dependencies]. py_bindingsnow inherits version, authors, edition, license, and related metadata from the workspace root.- Pure Rust feature pins for datafusion/arrow/parquet (
flate2-zlib-rsbackend) documented inline where declared. - Resolved
clippy::assertions_on_constantsintests/distributed_*.rs,src/stats/gpu.rs, andsrc/stats/sampling/mod.rs. - Replaced hardcoded
/tmp/paths in the plugin and cloud-storage integration tests withstd::env::temp_dir()for cross-platform portability. - Corrected
stats::sampling::test_simple_sampleto assert the true invariant (sample_implnever adds columns — a known pre-existing limitation the test had been asserting against incorrectly). - Excluded
ParquetCompression::Zstdfromtest_parquet_compression_options, since Zstd is intentionally disabled under the Pure Rust build. - Dropped the unused
sqlfeature frompy_bindings/Cargo.toml— it never existed on the parentpandrscrate and only emitted a warning. - Purged 134 stale
*.backup2/*.rs.backup2files and added matching.gitignorepatterns. - 1813 tests pass (up from 1809 in 0.3.1). No public API changes.
Tips
- Subcrates should use
*.workspace = trueto inherit versions — set a dependency once at the workspace root and every member stays in sync. - Nothing to change in your own code: 0.3.2 is a drop-in patch with the same public API.
- Tests now use
std::env::temp_dir()instead of hardcoded/tmp/, so they run cleanly across platforms. - Zstd parquet compression is intentionally off under the Pure Rust build — reach for snappy or gzip instead.
This is the foundation
PandRS is the DataFrame layer of the COOLJAPAN scientific stack, sitting alongside NumRS2 and SciRS2 — and a clean, single-source-of-truth workspace keeps that layer easy to build and trust.
Repository: https://github.com/cool-japan/pandrs
Star the repo if you want a pandas-class DataFrame with no C, no Fortran, and a build you can reproduce.
Pure Rust DataFrames — fast, safe, and sovereign.
— KitaSan at COOLJAPAN OÜ April 19, 2026