Table Join
Join two CSV tables by a shared key column, with duplicate/unmatched-key diagnostics.
How to use
- Paste or upload both CSV tables — the base table you want to add columns to, and the table holding those columns.
- Pick the key column on each side (auto-suggested when a matching column name exists on both), the join type, and how to handle a key that matches more than one row.
- Check the diagnostics panel for unmatched and duplicate-key counts before downloading — a duplicate join-table key is what causes a one-to-many result.
- Key columns are always compared as text, never as numbers — a PNU or postal code with a leading zero ("0501234") is never silently turned into 501234.
- "Trim whitespace" and "ignore letter case" are both off by default — a mismatch you didn't expect is often a real data problem worth seeing before you hide it.
- Each table is capped at 5000 rows for this tool.
3 row(s) parsed.
2 row(s) parsed.
| pnu | owner_type | parcel_id | assessed_value |
|---|---|---|---|
| 1168010100108430000 | individual | 1168010100108430000 | 500000000 |
| 4113510300100120000 | corporate | 4113510300100120000 | 1200000000 |
| 1100000000000000000 | individual |
Code
Templated code mirroring this exact join configuration — not AI-generated.
import pandas as pd
result = pd.merge(left_df, right_df, how="left", left_on="pnu", right_on="parcel_id")Table Join Coverage
Joins two CSV tables on a shared key column (left or inner join). Key values are always compared as strings, so an identifier with a leading zero — a PNU, a postal code — is never silently coerced into a number and matched wrong.
The diagnostics panel shows duplicate keys on both sides, unmatched row counts, and whether any base row matched more than one join row before you download — a duplicate key in the join table is exactly what produces a one-to-many result, and this tool surfaces that rather than hiding it in a larger-than-expected row count.
Frequently asked questions
Is it safe to join on a code with a leading zero?
Yes — keys are always compared as text, never converted to numbers, so "0501234" is never matched against "501234".
What happens if the join table has duplicate keys?
With the default "add one row per match" setting, every matching join-table row produces its own output row, which can increase the result's row count — switch to "keep only the first match" to cap it at one row per base row; either way, the duplicate-key count is shown in the diagnostics panel.