Skip to content

Commit fa152ab

Browse files
authored
REGR: merge_ordered with fill_method="ffill" and how="left" (#57018)
fix regression in merge_ordered
1 parent b29e293 commit fa152ab

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
@@ -216,3 +216,26 @@ def test_ffill_validate_fill_method(self, left, right, invalid_method):
216216
ValueError, match=re.escape("fill_method must be 'ffill' or None")
217217
):
218218
merge_ordered(left, right, on="key", fill_method=invalid_method)
219+
220+
def test_ffill_left_merge(self):
221+
# GH 57010
222+
df1 = DataFrame(
223+
{
224+
"key": ["a", "c", "e", "a", "c", "e"],
225+
"lvalue": [1, 2, 3, 1, 2, 3],
226+
"group": ["a", "a", "a", "b", "b", "b"],
227+
}
228+
)
229+
df2 = DataFrame({"key": ["b", "c", "d"], "rvalue": [1, 2, 3]})
230+
result = merge_ordered(
231+
df1, df2, fill_method="ffill", left_by="group", how="left"
232+
)
233+
expected = DataFrame(
234+
{
235+
"key": ["a", "c", "e", "a", "c", "e"],
236+
"lvalue": [1, 2, 3, 1, 2, 3],
237+
"group": ["a", "a", "a", "b", "b", "b"],
238+
"rvalue": [np.nan, 2.0, 2.0, np.nan, 2.0, 2.0],
239+
}
240+
)
241+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)