Skip to content

Commit 8db5eaf

Browse files
committed
BUG: Support to create DataFrame from list subclasses.
Issue: pandas-dev#21226
1 parent 1c2844a commit 8db5eaf

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

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)