finds.dev← search

// the find

pyjanitor-devs/pyjanitor

★ 1,500 · Python · MIT · updated Jul 2026

Clean APIs for data cleaning. Python implementation of R package Janitor

pyjanitor brings R's janitor package to Python, sitting on top of pandas as a method-chaining vocabulary for data cleaning. It registers its functions directly onto DataFrame via pandas_flavor, so you get `.clean_names().remove_empty()` instead of standalone function calls. The target audience is data scientists and analysts who spend significant time wrangling messy real-world DataFrames.

The method-chaining API is genuinely well-designed — verb-based names like `rename_column`, `add_column`, `remove_empty` read as a pipeline rather than a pile of reassignments. The `conditional_join` module is surprisingly capable, handling range joins and non-equi joins that vanilla pandas doesn't support without manual merge-then-filter. The Polars submodule is a real addition, not an afterthought — `pivot_longer`, `complete`, `clean_names`, and `row_to_names` are all there with their own test coverage. Actively maintained with recent pushes and a clear release workflow.

The dependency story is a mess: the full install pulls in biology, chemistry, engineering, finance, and PySpark submodules via optional extras, but the boundary between core and optional is blurry and the `.requirements/` directory has 10+ separate compiled files that are easy to let drift out of sync. Several functions are thin wrappers around one or two pandas calls — `rename_column` is literally just `.rename()` with a slightly different signature — which adds cognitive overhead for anyone who already knows pandas well and now has to remember which library owns which method. The `pandas_flavor` dependency for DataFrame method registration is a runtime requirement for something that could be done with `__init_subclass__` or a simple accessor pattern. No async or lazy evaluation support, so it doesn't compose with anything outside the eager pandas/Polars world.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →