Skip to content

Match pandas merge/join dtype, index and error semantics - #23060

Merged
rapids-bot[bot] merged 22 commits into
NVIDIA:mainfrom
galipremsagar:merge-pandas-semantics
Jul 15, 2026
Merged

Match pandas merge/join dtype, index and error semantics#23060
rapids-bot[bot] merged 22 commits into
NVIDIA:mainfrom
galipremsagar:merge-pandas-semantics

Conversation

@galipremsagar

@galipremsagar galipremsagar commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Description

Makes merge/join match pandas across the dtype/index/error semantics exercised by tests/reshape/merge/test_merge.py under cudf.pandas. The changes are not gated on mode.pandas_compatible — cudf-classic now matches pandas too, and the affected cudf-classic tests are updated accordingly.

Failures in tests/reshape/merge/test_merge.py go from 92 → 13 under cudf.pandas; the full cudf-classic suite passes (80k+ tests via pytest -n 12 --dist=worksteal, 0 regressions), along with the dask_cudf and custreamz suites.

What changed

  • Suffix duplicate columns → raise pandas.errors.MergeError when suffixing introduces a duplicate label not already present in the inputs (previously silently dropped a column).
  • left_index/right_index must be boolValueError.
  • Numeric-vs-string keyValueError ("You are trying to merge on ... use pd.concat") instead of silently coercing.
  • Extension-dtype keys (nullable/pyarrow) → the retained key keeps the LEFT operand's dtype for all join types.
  • Empty-frame keys → keep their original dtype (pandas never coerces an empty object key against an empty numeric key).
  • Categorical keys → decategorize to the common categories dtype unless the two category sets match (up to permutation), for every join type; matching pandas.
  • Index selection → the result keeps a frame's index only when it joined via the *_index flag, or the same index level is used as key on both sides (on=). An index level used via left_on/right_on, or a plain column merge, yields a default RangeIndex.
  • Unmatched rows → coalesce the surviving key column from the opposite index (left_on+right_index), drop the index name and upcast a numpy integer index/column to float64 (numpy has no integer NA sentinel). The upcast applies only when the merge itself introduces the missing values: each side's gather map is checked for unmatched entries, so a column that merely carried cudf-native nulls into the merge (which pandas cannot represent in a numpy int column) keeps its integer dtype — as does every column of a fully-matched join.
  • Numpy key dtypes → differently-named keys keep their own dtype; same-name keys keep the LEFT dtype for inner/left joins (right/outer take the common type).

Keeping merge semantics out of internal operations

Several cudf operations are implemented on top of DataFrame.merge/join — binop index alignment, reindex, .loc setitem value alignment, DataFrame construction from Series, concat(axis=1) — but pandas' merge dtype rules don't apply to those operations in pandas itself (e.g. reindex(..., fill_value=0) keeps int64, and misaligned binops are documented in cudf to produce nullable ints, not float64). Rather than gating merge behavior, the internal helpers no longer route data columns through the merge machinery:

  • _align_to_index and _reindex now join indexes only (with a positional iota column) and gather the data columns natively afterwards, so column dtypes are untouched by alignment; _reindex's own pandas dtype rules (Align DataFrame.reindex dtype and validation behavior with pandas #22914) remain the single source of reindex dtype behavior.
  • _indices_from_labels restores the positional column's integer dtype after its label join (row positions round-trip float64 losslessly).
  • Alignment call sites pre-unify unordered categorical indexes with differing category sets to a merged-categories dtype (first-appearance order), and concat's combined-index computation no longer sorts categorical unions — pandas' union of categoricals decategorizes, so sorting would order lexically instead of by appearance like pd.concat does.
  • dask_cudf's test_merging_categorical_columns expectation is updated to the pandas-matching result (merging on categorical keys with different category sets decategorizes; verified identical to dask-with-pandas, including the dtype-mismatch UserWarning).

Not addressed (inherent / out of scope, kept in the xfail list)

test_merge_nocopy (cudf can't share memory), test_merge_left_empty_right_notempty (None-vs-NaN), test_merge_incompat_dtypes_are_ok (cudf represents strings as StringDtype, not numpy object), the IntervalIndex mapped-index case, outer-merge row ordering (intc/uintc), the Series-with-tuple-name nlevels check, test_merge_right_left_index (an extra materialized key column), and a tz DST / timedelta case.

Checklist

  • I am familiar with the Contributing Guidelines.
  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

@galipremsagar
galipremsagar requested a review from a team as a code owner July 1, 2026 03:14
@galipremsagar
galipremsagar requested review from bdice and mroeschke July 1, 2026 03:14
@copy-pr-bot

copy-pr-bot Bot commented Jul 1, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@github-actions github-actions Bot added Python Affects Python cuDF API. cudf.pandas Issues specific to cudf.pandas labels Jul 1, 2026
@GPUtester GPUtester moved this to In Progress in cuDF Python Jul 1, 2026
@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR aligns cuDF merge, join, and index behavior more closely with pandas by updating categorical handling, index alignment and reindexing, merge key typing, result construction, post-merge key dtype restoration, and related tests and plugin mappings.

Changes

Merge and index semantics rework

Layer / File(s) Summary
Categorical join matching
python/cudf/cudf/core/join/_join_helpers.py, python/cudf/cudf/core/reshape.py, python/cudf/cudf/core/index.py
Reworks categorical join-key matching, combined-index sorting defaults, and intersection casting for differing numeric dtypes.
Index alignment and reindexing
python/cudf/cudf/core/indexed_frame.py, python/cudf/cudf/core/series.py
Adds positional gather-map helpers and rewrites index alignment and reindexing to join indexes first and gather data afterward.
Merge key validation and result assembly
python/cudf/cudf/core/join/join.py
Tracks merge flags and unmatched sides, changes key selection and validation, reworks suffix and duplicate-label handling, promotes null-affected numeric outputs, and rewrites result index selection.
DataFrame.merge key dtype restoration
python/cudf/cudf/core/dataframe.py
Adds post-merge restoration of join-key column dtypes based on merge orientation and provided key parameters.
Merge and join expectation updates
python/cudf/cudf/tests/reshape/test_join.py, python/cudf/cudf/tests/reshape/test_merge.py, python/dask_cudf/dask_cudf/tests/test_core.py
Updates merge and join tests for categorical decategorization, null-driven upcasting, suffix validation, duplicate-label errors, key retention, and index ordering.
Pandas testing plugin mappings
python/cudf/cudf/pandas/scripts/pandas-testing-plugin.py
Curates merge-related pytest reason mappings by removing stale entries and keeping a smaller set of updated cases.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • rapidsai/cudf#22914: Related index and reindex dtype handling changes, including null-driven upcasting and dtype preservation.
  • rapidsai/cudf#23059: Related merge result assembly changes, especially suffix handling and duplicate-label validation.

Suggested labels: improvement, 3 - Ready for Review

Suggested reviewers: wence-, Matt711, vyasr, TomAugspurger

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: aligning merge/join dtype, index, and error behavior with pandas.
Description check ✅ Passed The description is directly about pandas-aligned merge/join semantics and matches the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@python/cudf/cudf/core/join/_join_helpers.py`:
- Around line 207-215: Update the public DataFrame.merge documentation to match
the new categorical join semantics: when left and right category sets differ,
both sides are decategorized to the common dtype for every join type. Locate the
merge API docstring and any categorical-join behavior notes tied to
DataFrame.merge, and revise the return/behavior section so it no longer
describes the old join-type-dependent unordered-categorical handling.

In `@python/cudf/cudf/core/join/join.py`:
- Around line 306-324: The merge-type guard in join logic is only checking
lcol.dtype and rcol.dtype, so categorical keys can slip through before
_match_join_keys decategorizes them. Update the numeric-vs-string validation in
join.py to also inspect categorical key category dtypes (for example via the
join-key handling around the existing l_num/r_num and l_str/r_str checks) and
reject cases where a categorical with string categories is paired with a numeric
key. Keep the existing ValueError path and ensure the check runs before any
decategorization/casting so pandas-compatible rejection still happens.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: dc85c2b8-ba45-4868-86a8-efbcca5e2b62

📥 Commits

Reviewing files that changed from the base of the PR and between bd7bb74 and 2dd7ab3.

📒 Files selected for processing (6)
  • python/cudf/cudf/core/dataframe.py
  • python/cudf/cudf/core/join/_join_helpers.py
  • python/cudf/cudf/core/join/join.py
  • python/cudf/cudf/pandas/scripts/pandas-testing-plugin.py
  • python/cudf/cudf/tests/reshape/test_join.py
  • python/cudf/cudf/tests/reshape/test_merge.py
💤 Files with no reviewable changes (1)
  • python/cudf/cudf/pandas/scripts/pandas-testing-plugin.py

Comment on lines +207 to +215
# Different category sets: pandas decategorizes both sides to their common
# categories dtype (the result is not categorical), for every join type.
common_type = find_common_type(
(ltype.categories.dtype, rtype.categories.dtype)
)
return (
lcol._get_decategorized_column().astype(common_type),
rcol._get_decategorized_column().astype(common_type),
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

HIGH: Update the public merge docs for the new categorical behavior.

Issue: DataFrame.merge still documents the old unordered-categorical behavior by join type, but this path now decategorizes differing category sets for every join type.
Why: Public API docs will describe the wrong dtype semantics for categorical joins.

As per coding guidelines, “Ensure all public API methods have complete docstrings documenting parameters, return values, and behavior.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@python/cudf/cudf/core/join/_join_helpers.py` around lines 207 - 215, Update
the public DataFrame.merge documentation to match the new categorical join
semantics: when left and right category sets differ, both sides are
decategorized to the common dtype for every join type. Locate the merge API
docstring and any categorical-join behavior notes tied to DataFrame.merge, and
revise the return/behavior section so it no longer describes the old
join-type-dependent unordered-categorical handling.

Source: Coding guidelines

Comment on lines +306 to +324
if len(lcol) and len(rcol):
# pandas refuses to merge a numeric key against a string key
# (a numeric-looking string is NOT silently parsed). Empty
# keys are inferred as ``empty`` rather than ``string`` by
# pandas and so are exempt from this check.
l_num = is_dtype_obj_numeric(
lcol.dtype
) and lcol.dtype.kind in ("iuf")
r_num = is_dtype_obj_numeric(
rcol.dtype
) and rcol.dtype.kind in ("iuf")
l_str = is_dtype_obj_string(lcol.dtype)
r_str = is_dtype_obj_string(rcol.dtype)
if (l_str and r_num) or (r_str and l_num):
raise ValueError(
f"You are trying to merge on {lcol.dtype} and "
f"{rcol.dtype} columns for key '{left_key.name}'. "
"If you wish to proceed you should use pd.concat"
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

HIGH: Validate categorical key category dtypes too.

Issue: This numeric-vs-string guard checks lcol.dtype/rcol.dtype directly, so a categorical key with string categories merged against a numeric key can bypass the new pandas-compatible rejection before _match_join_keys decategorizes/casts it.
Why: This can still coerce or compare numeric-vs-string merge keys instead of raising.

Suggested direction
+            def _comparison_dtype(col):
+                dtype = col.dtype
+                return (
+                    dtype.categories.dtype
+                    if isinstance(dtype, CategoricalDtype)
+                    else dtype
+                )
+
             if len(lcol) and len(rcol):
+                l_dtype = _comparison_dtype(lcol)
+                r_dtype = _comparison_dtype(rcol)
                 l_num = is_dtype_obj_numeric(
-                    lcol.dtype
-                ) and lcol.dtype.kind in ("iuf")
+                    l_dtype
+                ) and l_dtype.kind in ("iuf")
                 r_num = is_dtype_obj_numeric(
-                    rcol.dtype
-                ) and rcol.dtype.kind in ("iuf")
-                l_str = is_dtype_obj_string(lcol.dtype)
-                r_str = is_dtype_obj_string(rcol.dtype)
+                    r_dtype
+                ) and r_dtype.kind in ("iuf")
+                l_str = is_dtype_obj_string(l_dtype)
+                r_str = is_dtype_obj_string(r_dtype)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if len(lcol) and len(rcol):
# pandas refuses to merge a numeric key against a string key
# (a numeric-looking string is NOT silently parsed). Empty
# keys are inferred as ``empty`` rather than ``string`` by
# pandas and so are exempt from this check.
l_num = is_dtype_obj_numeric(
lcol.dtype
) and lcol.dtype.kind in ("iuf")
r_num = is_dtype_obj_numeric(
rcol.dtype
) and rcol.dtype.kind in ("iuf")
l_str = is_dtype_obj_string(lcol.dtype)
r_str = is_dtype_obj_string(rcol.dtype)
if (l_str and r_num) or (r_str and l_num):
raise ValueError(
f"You are trying to merge on {lcol.dtype} and "
f"{rcol.dtype} columns for key '{left_key.name}'. "
"If you wish to proceed you should use pd.concat"
)
def _comparison_dtype(col):
dtype = col.dtype
return (
dtype.categories.dtype
if isinstance(dtype, CategoricalDtype)
else dtype
)
if len(lcol) and len(rcol):
# pandas refuses to merge a numeric key against a string key
# (a numeric-looking string is NOT silently parsed). Empty
# keys are inferred as ``empty`` rather than ``string`` by
# pandas and so are exempt from this check.
l_dtype = _comparison_dtype(lcol)
r_dtype = _comparison_dtype(rcol)
l_num = is_dtype_obj_numeric(
l_dtype
) and l_dtype.kind in ("iuf")
r_num = is_dtype_obj_numeric(
r_dtype
) and r_dtype.kind in ("iuf")
l_str = is_dtype_obj_string(l_dtype)
r_str = is_dtype_obj_string(r_dtype)
if (l_str and r_num) or (r_str and l_num):
raise ValueError(
f"You are trying to merge on {lcol.dtype} and "
f"{rcol.dtype} columns for key '{left_key.name}'. "
"If you wish to proceed you should use pd.concat"
)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@python/cudf/cudf/core/join/join.py` around lines 306 - 324, The merge-type
guard in join logic is only checking lcol.dtype and rcol.dtype, so categorical
keys can slip through before _match_join_keys decategorizes them. Update the
numeric-vs-string validation in join.py to also inspect categorical key category
dtypes (for example via the join-key handling around the existing l_num/r_num
and l_str/r_str checks) and reject cases where a categorical with string
categories is paired with a numeric key. Keep the existing ValueError path and
ensure the check runs before any decategorization/casting so pandas-compatible
rejection still happens.

@galipremsagar galipremsagar added bug Something isn't working breaking Breaking change labels Jul 1, 2026
@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test 01fbacc

@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test 304c1d6

@galipremsagar
galipremsagar requested a review from a team as a code owner July 2, 2026 19:29
@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test d08fdd0

@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test 66d1d18

Comment thread python/cudf/cudf/core/join/join.py Outdated
Comment on lines +181 to +182
self._left_index_flag = bool(left_index)
self._right_index_flag = bool(right_index)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: These should already be bool correct?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — dropped the casts (they come straight from the public API defaults as bool).

Comment thread python/cudf/cudf/core/join/join.py Outdated
Comment on lines +234 to +235
right_names = set(rhs._data)
on_names = [name for name in lhs._data if name in right_names]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
right_names = set(rhs._data)
on_names = [name for name in lhs._data if name in right_names]
right_names = set(rhs._column_names)
on_names = [name for name in lhs._column_names if name in right_names]

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied.

Comment on lines +230 to +231
# the intersection of columns in both frames, in left-frame
# column order like pandas (a set here would make the key

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: Is is always in left-frame column order regardless of the merge how method?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes — pandas infers the common keys from the left frame's column order for every how (pandas 3.0.3, left.columns = [b, a, v], right.columns = [a, b, w]: result columns are [b, a, v, w] for inner/left/right/outer alike).

Good catch though: checking this exposed that cuDF's how='right' operand swap made the inferred keys follow the right frame's order — both the key column order and the multi-key sort priority. Fixed in 474f7f9 by passing the inferred keys (in original-left order) explicitly through the swap and restoring pandas' column layout by label, with a parametrized test over all four how values.

Comment thread python/cudf/cudf/core/join/join.py Outdated
Comment on lines +323 to +326
) and lcol.dtype.kind in ("iuf")
r_num = is_dtype_obj_numeric(
rcol.dtype
) and rcol.dtype.kind in ("iuf")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) and lcol.dtype.kind in ("iuf")
r_num = is_dtype_obj_numeric(
rcol.dtype
) and rcol.dtype.kind in ("iuf")
) and lcol.dtype.kind in "iuf"
r_num = is_dtype_obj_numeric(
rcol.dtype
) and rcol.dtype.kind in "iuf"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied.

Comment thread python/cudf/cudf/core/join/join.py Outdated
label for label in set(rlabels) if label in left_not_renamed
)
if dups:
from pandas.errors import MergeError

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we import this at the top?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — moved to the module imports.

if col.null_count == 0:
return index
col = Merge._promote_column_with_nulls(col)
return cudf.Index._from_column(col, name=None)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should name=index.name to maintain the name?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentional — pandas drops the name exactly when unmatched rows introduce missing values into the mapped index (and upcasts int64 to float64), which is the only case this helper rewrites; the null_count == 0 early return above keeps the name otherwise. On pandas 3.0.3:

left = pd.DataFrame({"k": [10, 20], "v": [1, 2]}, index=pd.Index([100, 200], name="lname"))
right = pd.DataFrame({"w": [4, 5, 6]}, index=pd.Index([10, 20, 30], name="ridx"))

left.merge(right, left_on="k", right_index=True, how="right").index
# Index([100.0, 200.0, nan], dtype='float64')   <- name dropped, upcast

left.merge(right.iloc[:2], left_on="k", right_index=True, how="right").index
# Index([100, 200], dtype='int64', name='lname') <- fully matched: name kept

* Drop redundant bool() casts on left_index/right_index.
* Infer common key columns via _column_names.
* Simplify dtype.kind membership checks; hoist the MergeError import.
* Keep the original left frame's key order for inferred-key right
  merges: pandas infers the merge keys from the left frame's column
  order for every `how`, but the right-join operand swap made both the
  key column order and the multi-key sort priority follow the right
  frame. Pass the inferred keys explicitly through the swap and restore
  pandas' column layout by label (auto-detected keys are never
  suffixed, so labels are stable).
@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test 71278c2

…tion

The unaligned-index binop test's pow xfail (added on main) strict-XPASSes
with this branch: aligning the frames introduces missing rows, which now
promote the integer operands to float64 like pandas, so pow is computed
in float and no longer overflows.
@galipremsagar

Copy link
Copy Markdown
Contributor Author

CI failure diagnosed: all Python test jobs were failing on a single strict XPASS — test_different_shapes_and_columns_with_unaligned_indices[pow]. The xfail landed on main via #23176 ("int64 INT_POW overflows where pandas computes float pow"), and this branch actually fixes it: aligning the unaligned indices introduces missing rows, which now promote the integer operands to float64 (pandas semantics), so pow is computed in float and no longer overflows. Merged latest main and removed the now-stale xfail in c6d9baa. Full reshape/dataframe/series suites pass locally on the merged tree (53,617 tests).

@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test 25a73ec

@galipremsagar
galipremsagar requested a review from mroeschke July 14, 2026 10:14
@galipremsagar

Copy link
Copy Markdown
Contributor Author

/merge

@galipremsagar galipremsagar added the 5 - Ready to Merge Testing and reviews complete, ready to merge label Jul 15, 2026
# Conflicts:
#	python/cudf/cudf/tests/reshape/test_merge.py
@galipremsagar

Copy link
Copy Markdown
Contributor Author

/okay to test c9a24c7

@galipremsagar

Copy link
Copy Markdown
Contributor Author

/merge

1 similar comment
@galipremsagar

Copy link
Copy Markdown
Contributor Author

/merge

@rapids-bot
rapids-bot Bot merged commit 5b15dfa into NVIDIA:main Jul 15, 2026
126 checks passed
@github-project-automation github-project-automation Bot moved this from In Progress to Done in cuDF Python Jul 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

5 - Ready to Merge Testing and reviews complete, ready to merge breaking Breaking change bug Something isn't working cudf.pandas Issues specific to cudf.pandas Python Affects Python cuDF API.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants