Skip to content

Commit 7070aae

Browse files
authored
BUG: merge_ordered fails with list-like left_by or right_by (#38089)
1 parent e99e5ab commit 7070aae

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-3
lines changed

doc/source/whatsnew/v1.2.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,7 @@ Reshaping
754754
- Bug in :meth:`DataFrame.apply` not setting index of return value when ``func`` return type is ``dict`` (:issue:`37544`)
755755
- Bug in :func:`concat` resulting in a ``ValueError`` when at least one of both inputs had a non-unique index (:issue:`36263`)
756756
- Bug in :meth:`DataFrame.merge` and :meth:`pandas.merge` returning inconsistent ordering in result for ``how=right`` and ``how=left`` (:issue:`35382`)
757+
- Bug in :func:`merge_ordered` couldn't handle list-like ``left_by`` or ``right_by`` (:issue:`35269`)
757758

758759
Sparse
759760
^^^^^^

pandas/core/reshape/merge.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,7 @@ def _groupby_and_merge(by, on, left: "DataFrame", right: "DataFrame", merge_piec
140140

141141
# make sure join keys are in the merged
142142
# TODO, should merge_pieces do this?
143-
for k in by:
144-
if k in merged:
145-
merged[k] = key
143+
merged[by] = key
146144

147145
pieces.append(merged)
148146

pandas/tests/reshape/merge/test_merge_ordered.py

+62
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,65 @@ def test_doc_example(self):
115115
)
116116

117117
tm.assert_frame_equal(result, expected)
118+
119+
@pytest.mark.parametrize(
120+
"left, right, on, left_by, right_by, expected",
121+
[
122+
(
123+
DataFrame({"G": ["g", "g"], "H": ["h", "h"], "T": [1, 3]}),
124+
DataFrame({"T": [2], "E": [1]}),
125+
["T"],
126+
["G", "H"],
127+
None,
128+
DataFrame(
129+
{
130+
"G": ["g"] * 3,
131+
"H": ["h"] * 3,
132+
"T": [1, 2, 3],
133+
"E": [np.nan, 1.0, np.nan],
134+
}
135+
),
136+
),
137+
(
138+
DataFrame({"G": ["g", "g"], "H": ["h", "h"], "T": [1, 3]}),
139+
DataFrame({"T": [2], "E": [1]}),
140+
"T",
141+
["G", "H"],
142+
None,
143+
DataFrame(
144+
{
145+
"G": ["g"] * 3,
146+
"H": ["h"] * 3,
147+
"T": [1, 2, 3],
148+
"E": [np.nan, 1.0, np.nan],
149+
}
150+
),
151+
),
152+
(
153+
DataFrame({"T": [2], "E": [1]}),
154+
DataFrame({"G": ["g", "g"], "H": ["h", "h"], "T": [1, 3]}),
155+
["T"],
156+
None,
157+
["G", "H"],
158+
DataFrame(
159+
{
160+
"T": [1, 2, 3],
161+
"E": [np.nan, 1.0, np.nan],
162+
"G": ["g"] * 3,
163+
"H": ["h"] * 3,
164+
}
165+
),
166+
),
167+
],
168+
)
169+
def test_list_type_by(self, left, right, on, left_by, right_by, expected):
170+
# GH 35269
171+
result = merge_ordered(
172+
left=left,
173+
right=right,
174+
on=on,
175+
left_by=left_by,
176+
right_by=right_by,
177+
)
178+
179+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)