Skip to content

ENH: ExtensionArray.fillna #19909

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Mar 16, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
74614cb
ENH: ExtensionArray.fillna
TomAugspurger Feb 22, 2018
67a19ba
REF: cast to object
TomAugspurger Feb 27, 2018
280ac94
Revert "REF: cast to object"
TomAugspurger Feb 27, 2018
6705712
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Feb 28, 2018
69a0f9b
Simpler implementation
TomAugspurger Feb 28, 2018
4d6846b
Support limit
TomAugspurger Feb 28, 2018
f3b81dc
Test backfill with limit
TomAugspurger Feb 28, 2018
70efbb8
BUG: ensure array-like for indexer
TomAugspurger Feb 28, 2018
8fc3851
Refactor tolist
TomAugspurger Mar 1, 2018
39096e5
Test Series[ea].tolist
TomAugspurger Mar 1, 2018
9e44f88
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 1, 2018
e902f18
Fixed Categorical unwrapping
TomAugspurger Mar 1, 2018
17126e6
updated
TomAugspurger Mar 2, 2018
1106ef2
Back to getvalues list
TomAugspurger Mar 2, 2018
744c381
Simplified
TomAugspurger Mar 2, 2018
9a3fa55
As a method
TomAugspurger Mar 2, 2018
2bc43bc
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 3, 2018
f22fd7b
Removed tolist fully
TomAugspurger Mar 3, 2018
c26d261
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 5, 2018
b342efe
Linting
TomAugspurger Mar 5, 2018
a609f48
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 12, 2018
a35f93c
Just apply to objects
TomAugspurger Mar 12, 2018
3f78dec
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 12, 2018
1160e15
Linting
TomAugspurger Mar 13, 2018
c9c7a48
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 14, 2018
05fced6
Merge remote-tracking branch 'upstream/master' into fu1+fillna
TomAugspurger Mar 15, 2018
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
5 changes: 0 additions & 5 deletions pandas/core/arrays/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,11 +216,6 @@ def isna(self):
"""
raise AbstractMethodError(self)

def tolist(self):
# type: () -> list
"""Convert the array to a list of scalars."""
return list(self)

def fillna(self, value=None, method=None, limit=None):
""" Fill NA/NaN values using the specified method.

Expand Down
8 changes: 2 additions & 6 deletions pandas/core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@

from pandas.core.dtypes.missing import isna
from pandas.core.dtypes.generic import ABCDataFrame, ABCSeries, ABCIndexClass
from pandas.core.dtypes.cast import tolist
from pandas.core.dtypes.common import (
is_object_dtype,
is_list_like,
is_scalar,
is_datetimelike,
is_extension_type,
is_extension_array_dtype)

Expand Down Expand Up @@ -826,11 +826,7 @@ def tolist(self):
--------
numpy.ndarray.tolist
"""

if is_datetimelike(self):
return [com._maybe_box_datetimelike(x) for x in self._values]
else:
return self._values.tolist()
return tolist(self._values)

def __iter__(self):
"""
Expand Down
32 changes: 31 additions & 1 deletion pandas/core/dtypes/cast.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
from .common import (_ensure_object, is_bool, is_integer, is_float,
is_complex, is_datetimetz, is_categorical_dtype,
is_datetimelike,
is_extension_type, is_object_dtype,
is_extension_type, is_extension_array_dtype,
is_object_dtype,
is_datetime64tz_dtype, is_datetime64_dtype,
is_datetime64_ns_dtype,
is_timedelta64_dtype, is_timedelta64_ns_dtype,
Expand Down Expand Up @@ -1222,3 +1223,32 @@ def construct_1d_object_array_from_listlike(values):
result = np.empty(len(values), dtype='object')
result[:] = values
return result


def tolist(values):
"""Convert an array-like to a list of scalar types.

Parameters
----------
values : ndarray or ExtensionArray

Returns
-------
list
Each element of the list is a Python scalar (stor, int float)
or a pandas scalar (Timestamp / Timedelta / Interval / Period) or
the scalar type for 3rd party Extension Arrays.

See Also
--------
Series.tolist
numpy.ndarray.tolist
"""
from pandas.core.common import _maybe_box_datetimelike

if is_datetimelike(values):
return [_maybe_box_datetimelike(x) for x in values]
elif is_extension_array_dtype(values):
return list(values)
else:
return values.tolist()
15 changes: 14 additions & 1 deletion pandas/tests/dtypes/test_cast.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
maybe_convert_scalar,
find_common_type,
construct_1d_object_array_from_listlike,
construct_1d_arraylike_from_scalar)
construct_1d_arraylike_from_scalar,
tolist)
from pandas.core.dtypes.dtypes import (
CategoricalDtype,
DatetimeTZDtype,
Expand Down Expand Up @@ -324,6 +325,18 @@ def test_maybe_convert_objects_copy(self):
out = maybe_convert_objects(values, copy=True)
assert values is not out

@pytest.mark.parametrize('values, expected', [
(pd.date_range('2017', periods=1), [pd.Timestamp('2017')]),
(pd.period_range('2017', periods=1, freq='D'),
[pd.Period('2017', freq='D')]),
(pd.timedelta_range(0, periods=1), [pd.Timedelta('0')]),
(pd.interval_range(0, periods=1), [pd.Interval(0, 1)]),
(np.array([0, 1]), [0, 1]),
])
def test_tolist(self, values, expected):
result = tolist(values)
assert result == expected


class TestCommonTypes(object):

Expand Down
6 changes: 6 additions & 0 deletions pandas/tests/extension/base/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import pandas as pd
from pandas.compat import StringIO
from pandas.core.dtypes.cast import tolist
from pandas.core.dtypes.common import is_extension_array_dtype
from pandas.core.dtypes.dtypes import ExtensionDtype

Expand Down Expand Up @@ -53,3 +54,8 @@ def test_is_extension_array_dtype(self, data):
assert is_extension_array_dtype(data.dtype)
assert is_extension_array_dtype(pd.Series(data))
assert isinstance(data.dtype, ExtensionDtype)

def test_tolist(self, data):
result = tolist(data)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe rather test Series[extension].tolist() here? to check it is the same as list(data) (instead of testing this internal method)

expected = list(data)
assert result == expected