Skip to content

Commit 403c23d

Browse files
committed
BUG: Support to create DataFrame from list subclasses.
Issue: #21226
1 parent 1c2844a commit 403c23d

File tree

4 files changed

+29
-6
lines changed

4 files changed

+29
-6
lines changed

asv_bench/benchmarks/frame_ctor.py

+13
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,16 @@ def setup(self):
9999

100100
def time_frame_from_ndarray(self):
101101
self.df = DataFrame(self.data)
102+
103+
104+
class FromLists(object):
105+
106+
goal_time = 0.2
107+
108+
def setup(self):
109+
N = 1000
110+
M = 100
111+
self.data = [[j for j in range(M)] for i in range(N)]
112+
113+
def time_frame_from_lists(self):
114+
self.df = DataFrame(self.data)

doc/source/whatsnew/v0.23.1.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ Categorical
7070
Conversion
7171
^^^^^^^^^^
7272

73-
-
74-
-
73+
- Bug in :func:`to_object_array` prevented list subclasses to be used to create :class:`DataFrame` (:issue:`21226`)
7574

7675
Indexing
7776
^^^^^^^^

pandas/_libs/src/inference.pyx

+6-4
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,7 @@ def map_infer(ndarray arr, object f, bint convert=1):
14871487
return result
14881488

14891489

1490-
def to_object_array(list rows, int min_width=0):
1490+
def to_object_array(rows, int min_width=0):
14911491
"""
14921492
Convert a list of lists into an object array.
14931493
@@ -1508,20 +1508,22 @@ def to_object_array(list rows, int min_width=0):
15081508
cdef:
15091509
Py_ssize_t i, j, n, k, tmp
15101510
ndarray[object, ndim=2] result
1511+
list input_rows
15111512
list row
15121513

1513-
n = len(rows)
1514+
input_rows = <list>rows
1515+
n = len(input_rows)
15141516

15151517
k = min_width
15161518
for i from 0 <= i < n:
1517-
tmp = len(rows[i])
1519+
tmp = len(input_rows[i])
15181520
if tmp > k:
15191521
k = tmp
15201522

15211523
result = np.empty((n, k), dtype=object)
15221524

15231525
for i from 0 <= i < n:
1524-
row = rows[i]
1526+
row = <list>input_rows[i]
15251527

15261528
for j from 0 <= j < len(row):
15271529
result[i, j] = row[j]

pandas/tests/frame/test_constructors.py

+9
Original file line numberDiff line numberDiff line change
@@ -2149,6 +2149,15 @@ def test_constructor_range_dtype(self, dtype):
21492149
result = DataFrame({'A': range(5)}, dtype=dtype)
21502150
tm.assert_frame_equal(result, expected)
21512151

2152+
def test_frame_from_list_subclass(self):
2153+
# GH21226
2154+
class List(list):
2155+
pass
2156+
2157+
expected = DataFrame([[1, 2, 3], [4, 5, 6]])
2158+
result = DataFrame(List([List([1, 2, 3]), List([4, 5, 6])]))
2159+
tm.assert_frame_equal(result, expected)
2160+
21522161

21532162
class TestDataFrameConstructorWithDatetimeTZ(TestData):
21542163

0 commit comments

Comments
 (0)