Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion pandas-stubs/_typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,6 @@ InterpolateOptions: TypeAlias = Literal[
"cubicspline",
"from_derivatives",
]
ReplaceMethod: TypeAlias = Literal["pad", "ffill", "bfill"]
SortKind: TypeAlias = Literal["quicksort", "mergesort", "heapsort", "stable"]
NaPosition: TypeAlias = Literal["first", "last"]
JoinHow: TypeAlias = Literal["left", "right", "outer", "inner"]
Expand Down
51 changes: 40 additions & 11 deletions pandas-stubs/core/frame.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ from pandas._typing import (
RandomState,
ReadBuffer,
Renamer,
ReplaceMethod,
Scalar,
ScalarT,
SequenceNotStr,
Expand Down Expand Up @@ -799,24 +798,54 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
@overload
def replace(
self,
to_replace=...,
value: Scalar | NAType | Sequence | Mapping | Pattern | None = ...,
to_replace: (
Scalar
| NAType
| Sequence[Scalar | Pattern]
| Mapping[Hashable, Scalar | Pattern]
| Series[Any]
| Pattern
| None
) = ...,
value: (
Scalar | NAType | Sequence[Scalar] | Mapping[Hashable, Scalar] | None
) = ...,
*,
inplace: Literal[True],
limit: int | None = ...,
regex=...,
method: ReplaceMethod = ...,
regex: (
bool
| str
| Pattern
| Sequence[str | Pattern]
| Mapping[Hashable, str | Pattern]
| Series[Any]
) = ...,
) -> None: ...
@overload
def replace(
self,
to_replace=...,
value: Scalar | NAType | Sequence | Mapping | Pattern | None = ...,
to_replace: (
Scalar
| NAType
| Sequence[Scalar | Pattern]
| Mapping[Hashable, Scalar | Pattern]
| Series[Any]
| Pattern
| None
) = ...,
value: (
Scalar | NAType | Sequence[Scalar] | Mapping[Hashable, Scalar] | None
) = ...,
*,
inplace: Literal[False] = ...,
limit: int | None = ...,
regex=...,
method: ReplaceMethod = ...,
regex: (
bool
| str
| Pattern
| Sequence[str | Pattern]
| Mapping[Hashable, str | Pattern]
| Series[Any]
) = ...,
) -> Self: ...
def shift(
self,
Expand Down
52 changes: 41 additions & 11 deletions pandas-stubs/core/series.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ from datetime import (
timedelta,
)
from pathlib import Path
from re import Pattern
from typing import (
Any,
ClassVar,
Expand Down Expand Up @@ -141,7 +142,6 @@ from pandas._typing import (
QuantileInterpolation,
RandomState,
Renamer,
ReplaceMethod,
Scalar,
ScalarT,
SequenceNotStr,
Expand Down Expand Up @@ -1089,24 +1089,54 @@ class Series(IndexOpsMixin[S1], NDFrame):
@overload
def replace(
self,
to_replace: _str | list | dict | Series[S1] | float | None = ...,
value: Scalar | NAType | dict | list | _str | None = ...,
to_replace: (
Scalar
| NAType
| Sequence[Scalar | Pattern]
| Mapping[Scalar | Pattern, Scalar]
| Series[Any]
| Pattern
| None
) = ...,
value: (
Scalar | NAType | Sequence[Scalar] | Mapping[Scalar, Scalar] | None
) = ...,
*,
limit: int | None = ...,
regex=...,
method: ReplaceMethod = ...,
regex: (
bool
| str
| Pattern
| Sequence[str | Pattern]
| Mapping[Scalar | Pattern, Scalar]
| Series[Any]
) = ...,
inplace: Literal[True],
) -> None: ...
@overload
def replace(
self,
to_replace: _str | list | dict | Series[S1] | float | None = ...,
value: Scalar | NAType | dict | list | _str | None = ...,
to_replace: (
Scalar
| NAType
| Sequence[Scalar | Pattern]
| Mapping[Scalar | Pattern, Scalar]
| Series[Any]
| Pattern
| None
) = ...,
value: (
Scalar | NAType | Sequence[Scalar] | Mapping[Scalar, Scalar] | None
) = ...,
*,
inplace: Literal[False] = ...,
limit: int | None = ...,
regex=...,
method: ReplaceMethod = ...,
regex: (
bool
| str
| Pattern
| Sequence[str | Pattern]
| Mapping[Scalar | Pattern, Scalar]
| Series[Any]
) = ...,
) -> Series[S1]: ...
def shift(
self,
Expand Down
39 changes: 39 additions & 0 deletions tests/test_frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io
import itertools
from pathlib import Path
import re
import string
import sys
from typing import (
Expand Down Expand Up @@ -2570,6 +2571,44 @@ def test_types_replace() -> None:
assert assert_type(df.replace(1, 2, inplace=True), None) is None


def test_dataframe_replace() -> None:
df = pd.DataFrame({"col1": ["a", "ab", "ba"]})
pattern = re.compile(r"^a.*")
check(assert_type(df.replace("a", "x"), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace({"a": "x"}), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace(pd.Series({"a": "x"})), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace(pattern, "x"), pd.DataFrame), pd.DataFrame)
check(
assert_type(df.replace({"col1": "a"}, {"col1": "x"}), pd.DataFrame),
pd.DataFrame,
)
check(
assert_type(df.replace({"col1": pattern}, {"col1": "x"}), pd.DataFrame),
pd.DataFrame,
)
check(assert_type(df.replace(["a"], ["x"]), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace([pattern], ["x"]), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace("^a.*", "x", regex=True), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace(value="x", regex="^a."), pd.DataFrame), pd.DataFrame)
check(assert_type(df.replace(value="x", regex=["^a."]), pd.DataFrame), pd.DataFrame)
check(
assert_type(df.replace(value="x", regex={"col1": "^a."}), pd.DataFrame),
pd.DataFrame,
)
check(assert_type(df.replace(value="x", regex=pattern), pd.DataFrame), pd.DataFrame)
check(
assert_type(df.replace(value="x", regex=[pattern]), pd.DataFrame), pd.DataFrame
)
check(
assert_type(df.replace(value="x", regex={"col1": pattern}), pd.DataFrame),
pd.DataFrame,
)
check(assert_type(df.replace(regex={"a": "x"}), pd.DataFrame), pd.DataFrame)
check(
assert_type(df.replace(regex=pd.Series({"a": "x"})), pd.DataFrame), pd.DataFrame
)


def test_loop_dataframe() -> None:
# GH 70
df = pd.DataFrame({"x": [1, 2, 3]})
Expand Down
34 changes: 34 additions & 0 deletions tests/test_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -1410,6 +1410,40 @@ def test_types_replace() -> None:
assert assert_type(s.replace(1, 2, inplace=True), None) is None


def test_series_replace() -> None:
s: pd.Series[str] = pd.DataFrame({"col1": ["a", "ab", "ba"]})["col1"]
pattern = re.compile(r"^a.*")
check(assert_type(s.replace("a", "x"), "pd.Series[str]"), pd.Series)
check(assert_type(s.replace(pattern, "x"), "pd.Series[str]"), pd.Series)
check(
assert_type(s.replace({"a": "z"}), "pd.Series[str]"),
pd.Series,
)
check(
assert_type(s.replace(pd.Series({"a": "z"})), "pd.Series[str]"),
pd.Series,
)
check(
assert_type(s.replace({pattern: "z"}), "pd.Series[str]"),
pd.Series,
)
check(assert_type(s.replace(["a"], ["x"]), "pd.Series[str]"), pd.Series)
check(assert_type(s.replace([pattern], ["x"]), "pd.Series[str]"), pd.Series)
check(assert_type(s.replace(r"^a.*", "x", regex=True), "pd.Series[str]"), pd.Series)
check(assert_type(s.replace(value="x", regex=r"^a.*"), "pd.Series[str]"), pd.Series)
check(
assert_type(s.replace(value="x", regex=[r"^a.*"]), "pd.Series[str]"), pd.Series
)
check(assert_type(s.replace(value="x", regex=pattern), "pd.Series[str]"), pd.Series)
check(
assert_type(s.replace(value="x", regex=[pattern]), "pd.Series[str]"), pd.Series
)
check(assert_type(s.replace(regex={"a": "x"}), "pd.Series[str]"), pd.Series)
check(
assert_type(s.replace(regex=pd.Series({"a": "x"})), "pd.Series[str]"), pd.Series
)


def test_cat_accessor() -> None:
# GH 43
s: pd.Series[str] = pd.Series(
Expand Down