Skip to content

Commit 9f2cb73

Browse files
authored
ENH: EA.tolist (pandas-dev#43920)
1 parent 1ad8b81 commit 9f2cb73

File tree

6 files changed

+38
-13
lines changed

6 files changed

+38
-13
lines changed

doc/source/reference/extensions.rst

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ objects.
6060
api.extensions.ExtensionArray.nbytes
6161
api.extensions.ExtensionArray.ndim
6262
api.extensions.ExtensionArray.shape
63+
api.extensions.ExtensionArray.tolist
6364
6465
Additionally, we have some utility methods for ensuring your object
6566
behaves correctly.

pandas/core/arrays/base.py

+17
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ class ExtensionArray:
130130
searchsorted
131131
shift
132132
take
133+
tolist
133134
unique
134135
view
135136
_concat_same_type
@@ -1348,6 +1349,22 @@ def _reduce(self, name: str, *, skipna: bool = True, **kwargs):
13481349
# ------------------------------------------------------------------------
13491350
# Non-Optimized Default Methods
13501351

1352+
def tolist(self) -> list:
1353+
"""
1354+
Return a list of the values.
1355+
1356+
These are each a scalar type, which is a Python scalar
1357+
(for str, int, float) or a pandas scalar
1358+
(for Timestamp/Timedelta/Interval/Period)
1359+
1360+
Returns
1361+
-------
1362+
list
1363+
"""
1364+
if self.ndim > 1:
1365+
return [x.tolist() for x in self]
1366+
return list(self)
1367+
13511368
def delete(self: ExtensionArrayT, loc: PositionalIndexer) -> ExtensionArrayT:
13521369
indexer = np.delete(np.arange(len(self)), loc)
13531370
return self.take(indexer)

pandas/core/arrays/categorical.py

+3-10
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
Ordered,
4141
PositionalIndexer2D,
4242
PositionalIndexerTuple,
43-
Scalar,
4443
ScalarIndexer,
4544
SequenceIndexer,
4645
Shape,
@@ -566,17 +565,11 @@ def itemsize(self) -> int:
566565
"""
567566
return self.categories.itemsize
568567

569-
def tolist(self) -> list[Scalar]:
568+
def to_list(self):
570569
"""
571-
Return a list of the values.
572-
573-
These are each a scalar type, which is a Python scalar
574-
(for str, int, float) or a pandas scalar
575-
(for Timestamp/Timedelta/Interval/Period)
570+
Alias for tolist.
576571
"""
577-
return list(self)
578-
579-
to_list = tolist
572+
return self.tolist()
580573

581574
@classmethod
582575
def _from_inferred_categories(

pandas/core/base.py

-3
Original file line numberDiff line numberDiff line change
@@ -740,9 +740,6 @@ def tolist(self):
740740
numpy.ndarray.tolist : Return the array as an a.ndim-levels deep
741741
nested list of Python scalars.
742742
"""
743-
if not isinstance(self._values, np.ndarray):
744-
# check for ndarray instead of dtype to catch DTA/TDA
745-
return list(self._values)
746743
return self._values.tolist()
747744

748745
to_list = tolist

pandas/tests/extension/base/dim2.py

+11
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,17 @@ def test_iter_2d(self, data):
9797
assert obj.ndim == 1
9898
assert len(obj) == arr2d.shape[1]
9999

100+
def test_tolist_2d(self, data):
101+
arr2d = data.reshape(1, -1)
102+
103+
result = arr2d.tolist()
104+
expected = [data.tolist()]
105+
106+
assert isinstance(result, list)
107+
assert all(isinstance(x, list) for x in result)
108+
109+
assert result == expected
110+
100111
def test_concat_2d(self, data):
101112
left = data.reshape(-1, 1)
102113
right = left.copy()

pandas/tests/extension/base/interface.py

+6
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,9 @@ def test_view(self, data):
119119

120120
# check specifically that the `dtype` kwarg is accepted
121121
data.view(dtype=None)
122+
123+
def test_tolist(self, data):
124+
result = data.tolist()
125+
expected = list(data)
126+
assert isinstance(result, list)
127+
assert result == expected

0 commit comments

Comments
 (0)