Skip to content

Commit 3b833cf

Browse files
Backport PR #57018 on branch 2.2.x (REGR: merge_ordered with fill_method="ffill" and how="left") (#57021)
Backport PR #57018: REGR: merge_ordered with fill_method="ffill" and how="left" Co-authored-by: Luke Manley <[email protected]>
1 parent 662e3f8 commit 3b833cf

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

doc/source/whatsnew/v2.2.1.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ including other versions of pandas.
1313

1414
Fixed regressions
1515
~~~~~~~~~~~~~~~~~
16-
-
16+
- Fixed regression in :func:`merge_ordered` raising ``TypeError`` for ``fill_method="ffill"`` and ``how="left"`` (:issue:`57010`)
1717

1818
.. ---------------------------------------------------------------------------
1919
.. _whatsnew_221.bug_fixes:

pandas/core/reshape/merge.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1930,10 +1930,9 @@ def get_result(self, copy: bool | None = True) -> DataFrame:
19301930

19311931
if self.fill_method == "ffill":
19321932
if left_indexer is None:
1933-
raise TypeError("left_indexer cannot be None")
1934-
left_indexer = cast("npt.NDArray[np.intp]", left_indexer)
1935-
right_indexer = cast("npt.NDArray[np.intp]", right_indexer)
1936-
left_join_indexer = libjoin.ffill_indexer(left_indexer)
1933+
left_join_indexer = None
1934+
else:
1935+
left_join_indexer = libjoin.ffill_indexer(left_indexer)
19371936
if right_indexer is None:
19381937
right_join_indexer = None
19391938
else:

pandas/tests/reshape/merge/test_merge_ordered.py

+23
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,26 @@ def test_ffill_validate_fill_method(self, left, right, invalid_method):
219219
ValueError, match=re.escape("fill_method must be 'ffill' or None")
220220
):
221221
merge_ordered(left, right, on="key", fill_method=invalid_method)
222+
223+
def test_ffill_left_merge(self):
224+
# GH 57010
225+
df1 = DataFrame(
226+
{
227+
"key": ["a", "c", "e", "a", "c", "e"],
228+
"lvalue": [1, 2, 3, 1, 2, 3],
229+
"group": ["a", "a", "a", "b", "b", "b"],
230+
}
231+
)
232+
df2 = DataFrame({"key": ["b", "c", "d"], "rvalue": [1, 2, 3]})
233+
result = merge_ordered(
234+
df1, df2, fill_method="ffill", left_by="group", how="left"
235+
)
236+
expected = DataFrame(
237+
{
238+
"key": ["a", "c", "e", "a", "c", "e"],
239+
"lvalue": [1, 2, 3, 1, 2, 3],
240+
"group": ["a", "a", "a", "b", "b", "b"],
241+
"rvalue": [np.nan, 2.0, 2.0, np.nan, 2.0, 2.0],
242+
}
243+
)
244+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)