Data Analysis Best Practices
Reproducible, vectorized, well-typed analysis habits that prevent silent wrong numbers in notebooks and production jobs.
Search across all documentation pages
Reproducible, vectorized, well-typed analysis habits that prevent silent wrong numbers in notebooks and production jobs.
dtype, parse_dates, and usecols to read_csv - inference hides object columns.len(df), df.isna().sum(), and df.duplicated(subset=keys).sum() before transforms.pd.to_datetime(..., utc=True) at load; convert for display only.string[pyarrow] and category cut RAM on text keys in pandas 2.2+..loc for assignments. Never chain df[mask]["col"] = x - assign in one .loc call.groupby.agg and Polars expressions beat Python per-row UDFs.observed=True on categoricals. Skip unused category levels in pandas 2.x groupby/pivot.str.strip() and consistent casing prevent orphan merges.validate= on merges. many_to_one and one_to_one catch cardinality mistakes early.indicator=True on left joins. Quantify unmatched dimension rows before filling NA with zero.agg(total=("revenue", "sum")) beats mystery MultiIndex columns.deep=True. Shallow memory_usage lies on object columns.chunksize, Parquet column pruning, or Polars scan_parquet.sample(random_state=42) and numpy.random.default_rng for auditability.dt=2025-01-15/) plus manifest JSON.Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 16, 2026