Skip to content

Commit 116ac92

Browse files
bashtageKevin Sheppard
and
Kevin Sheppard
authored
ENH: Add from_dummies (#330)
* ENH: Add from_dummies * TYP: Improve typing accuracy * BUG: Use HashableT for non covariant dict Co-authored-by: Kevin Sheppard <[email protected]>
1 parent d136763 commit 116ac92

File tree

5 files changed

+102
-17
lines changed

5 files changed

+102
-17
lines changed

pandas-stubs/__init__.pyi

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ from .core.reshape.api import (
8080
concat as concat,
8181
crosstab as crosstab,
8282
cut as cut,
83+
from_dummies as from_dummies,
8384
get_dummies as get_dummies,
8485
lreshape as lreshape,
8586
melt as melt,

pandas-stubs/core/reshape/api.pyi

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
from pandas.core.reshape.concat import concat as concat
2+
from pandas.core.reshape.encoding import (
3+
from_dummies as from_dummies,
4+
get_dummies as get_dummies,
5+
)
26
from pandas.core.reshape.melt import (
37
lreshape as lreshape,
48
melt as melt,
@@ -14,7 +18,6 @@ from pandas.core.reshape.pivot import (
1418
pivot as pivot,
1519
pivot_table as pivot_table,
1620
)
17-
from pandas.core.reshape.reshape import get_dummies as get_dummies
1821
from pandas.core.reshape.tile import (
1922
cut as cut,
2023
qcut as qcut,
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from typing import (
2+
Hashable,
3+
Iterable,
4+
)
5+
6+
from pandas import (
7+
DataFrame,
8+
Series,
9+
)
10+
11+
from pandas._typing import (
12+
ArrayLike,
13+
Dtype,
14+
HashableT,
15+
)
16+
17+
def get_dummies(
18+
data: ArrayLike | DataFrame | Series,
19+
prefix: str | Iterable[str] | dict[HashableT, str] | None = ...,
20+
prefix_sep: str = ...,
21+
dummy_na: bool = ...,
22+
columns: list[HashableT] | None = ...,
23+
sparse: bool = ...,
24+
drop_first: bool = ...,
25+
dtype: Dtype | None = ...,
26+
) -> DataFrame: ...
27+
def from_dummies(
28+
data: DataFrame,
29+
sep: str | None = ...,
30+
default_category: Hashable | dict[str, Hashable] | None = ...,
31+
) -> DataFrame: ...

pandas-stubs/core/reshape/reshape.pyi

-16
This file was deleted.

tests/test_utility.py

+66
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,69 @@ def test_show_version():
99
with pytest.warns(UserWarning, match="Setuptools is replacing distutils"):
1010
check(assert_type(pd.show_versions(True), None), type(None))
1111
check(assert_type(pd.show_versions(False), None), type(None))
12+
13+
14+
def test_dummies():
15+
df = pd.DataFrame(
16+
pd.Series(["a", "b", "a", "b", "c", "a", "a"], dtype="category"), columns=["A"]
17+
)
18+
dummies = pd.get_dummies(df)
19+
check(assert_type(dummies, pd.DataFrame), pd.DataFrame)
20+
check(assert_type(pd.from_dummies(dummies), pd.DataFrame), pd.DataFrame)
21+
22+
df2 = pd.DataFrame(
23+
pd.Series(["a", "b", "a", "b", "c", "a", "a"], dtype="category"),
24+
columns=[("A",)],
25+
)
26+
check(
27+
assert_type(pd.get_dummies(df2, prefix={("A",): "bar"}), pd.DataFrame),
28+
pd.DataFrame,
29+
)
30+
31+
32+
def test_get_dummies_args():
33+
df = pd.DataFrame(
34+
{
35+
"A": pd.Series(["a", "b", "a", "b", "c", "a", "a"], dtype="category"),
36+
"B": pd.Series([1, 2, 1, 2, 3, 1, 1]),
37+
}
38+
)
39+
check(
40+
assert_type(
41+
pd.get_dummies(df, prefix="foo", prefix_sep="-", sparse=True), pd.DataFrame
42+
),
43+
pd.DataFrame,
44+
)
45+
check(
46+
assert_type(
47+
pd.get_dummies(
48+
df, prefix=["foo"], dummy_na=True, drop_first=True, dtype="bool"
49+
),
50+
pd.DataFrame,
51+
),
52+
pd.DataFrame,
53+
)
54+
check(
55+
assert_type(
56+
pd.get_dummies(df, prefix={"A": "foo", "B": "baz"}, columns=["A", "B"]),
57+
pd.DataFrame,
58+
),
59+
pd.DataFrame,
60+
)
61+
62+
63+
def test_from_dummies_args():
64+
df = pd.DataFrame(
65+
{
66+
"A": pd.Series(["a", "b", "a", "b", "c", "a", "a"], dtype="category"),
67+
}
68+
)
69+
dummies = pd.get_dummies(df, drop_first=True)
70+
71+
check(
72+
assert_type(
73+
pd.from_dummies(dummies, sep="_", default_category="a"),
74+
pd.DataFrame,
75+
),
76+
pd.DataFrame,
77+
)

0 commit comments

Comments
 (0)