DataComPy
DataComPy is a package to compare two DataFrames (or tables) such as Pandas, Spark, Polars, and
even Snowflake. Originally it was created to be something of a replacement
for SAS's PROC COMPARE for Pandas DataFrames with some more functionality than
just Pandas.DataFrame.equals(Pandas.DataFrame) (in that it prints out some stats,
and lets you tweak how accurate matches have to be). Supported types include:
- Pandas
- Polars
- Spark (classic and Spark Connect)
- Snowflake
Quick Installation
pip install datacompy
or
conda install datacompy
Installing extras
If you would like to use Spark or any other backends please make sure you install via extras:
pip install datacompy[spark]
pip install datacompy[snowflake]
Supported backends
- Pandas: (See documentation)
- Spark: (See documentation)
- Polars: (See documentation)
- Snowflake/Snowpark: (See documentation)
Command Line Interface
DataComPy ships a datacompy command, so ad hoc checks and CI pipelines do not
need a throw-away script (see documentation):
# Compare two files and print a report
datacompy compare --left before.csv --right after.csv --on id
# Fail a build on any difference, with a JSON report saved as an artifact
datacompy compare \
--left before.parquet --right after.parquet \
--on account_id,as_of_date \
--abs-tol balance=0.01 \
--max-unequal-rows 0 \
--report-format json --output reports/diff.json --quiet
It exits 0 when the datasets match, 1 when they differ, and 2 on error.
CSV, Parquet, and JSON inputs are supported on the pandas, polars, and Spark
backends, including tab separated CSV via a .tsv extension, and Snowflake
tables can be compared in place.
Programmatic Report Access
Every compare object exposes build_report_data() which returns a typed
ReportData object
— useful for dashboards, JSON export, or custom rendering without relying on
the string report:
import pandas as pd
from datacompy import PandasCompare
df1 = pd.DataFrame({"id": [1, 2, 3], "val": [10, 20, 30]})
df2 = pd.DataFrame({"id": [1, 2, 3], "val": [10, 99, 30]})
compare = PandasCompare(df1, df2, join_columns="id")
# Access structured data directly
data = compare.build_report_data()
print(data.row_summary.unequal_rows) # 1
print(data.mismatch_stats.stats[0].column) # 'val'
# Render / export — methods live on ReportData itself
print(data.render()) # same text as compare.report()
data.save("report.html") # HTML file
data.to_dict() # JSON-serializable dict
See the Report API documentation for the full reference.
Contributors
We welcome and appreciate your contributions! Before we can accept any contributions, we ask that you please be sure to sign the Contributor License Agreement (CLA).
This project adheres to the Open Source Code of Conduct. By participating, you are expected to honor this code.
Metadata
Release files for datacompy 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| datacompy-1.1.0.tar.gz | 148.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| datacompy-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 249.3 kB
Release files / datacompy-1.1.0.tar.gz
| Download URL | datacompy-1.1.0.tar.gz |
|---|---|
| Size | 148.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
244d53328568c457532b1472ec98f8de84ba237ed4e8f30775880a1182ee6b36
|
|
BLAKE2b-256 checksum How to use checksums |
25dfa67e0c1fa7f9fb2cace0f17d4e7e49f95b8a25238e6a016c13d02fa92b22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / datacompy-1.1.0-py3-none-any.whl
| Download URL | datacompy-1.1.0-py3-none-any.whl |
|---|---|
| Size | 100.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3e432f082d29576a9632b1d8fd43a3d97d271dc422ccc7f287365bb65508841b
|
|
BLAKE2b-256 checksum How to use checksums |
bab12362ee7dc29b358e2a42625e38e28b3bb42cf4833cca642ef8d830b444ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logSecurity for datacompy 1.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for datacompy-1.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.