Skip to content

Commit d8f7fd5

Browse files
committed
allow using Iterable in Series and DataFrame constructor
1 parent 27ebb3e commit d8f7fd5

File tree

4 files changed

+22
-16
lines changed

4 files changed

+22
-16
lines changed

pandas/core/frame.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import collections
1717
import itertools
1818
import sys
19-
import types
2019
import warnings
2120
from textwrap import dedent
2221

@@ -390,8 +389,8 @@ def __init__(self, data=None, index=None, columns=None, dtype=None,
390389
else:
391390
mgr = self._init_ndarray(data, index, columns, dtype=dtype,
392391
copy=copy)
393-
elif isinstance(data, (list, types.GeneratorType)):
394-
if isinstance(data, types.GeneratorType):
392+
elif isinstance(data, collections.Iterable):
393+
if not isinstance(data, collections.Sequence):
395394
data = list(data)
396395
if len(data) > 0:
397396
if is_list_like(data[0]) and getattr(data[0], 'ndim', 1) == 1:
@@ -416,8 +415,6 @@ def __init__(self, data=None, index=None, columns=None, dtype=None,
416415
copy=copy)
417416
else:
418417
mgr = self._init_dict({}, index, columns, dtype=dtype)
419-
elif isinstance(data, collections.Iterator):
420-
raise TypeError("data argument can't be an iterator")
421418
else:
422419
try:
423420
arr = np.array(data, dtype=dtype, copy=copy)

pandas/core/series.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# pylint: disable=E1101,E1103
77
# pylint: disable=W0703,W0622,W0613,W0201
88

9-
import types
9+
import collections
1010
import warnings
1111
from textwrap import dedent
1212

@@ -242,13 +242,12 @@ def __init__(self, data=None, index=None, dtype=None, name=None,
242242
"extension array of a different "
243243
"dtype ('{}').".format(dtype,
244244
data.dtype))
245-
246-
elif (isinstance(data, types.GeneratorType) or
247-
(compat.PY3 and isinstance(data, map))):
248-
data = list(data)
249245
elif isinstance(data, (set, frozenset)):
250246
raise TypeError("{0!r} type is unordered"
251247
"".format(data.__class__.__name__))
248+
elif (isinstance(data, collections.Iterable)
249+
and not isinstance(data, collections.Sized)):
250+
data = list(data)
252251
else:
253252

254253
# handle sparse passed here (and force conversion)

pandas/tests/frame/test_constructors.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,16 @@ def __len__(self, n):
953953
array.array('i', range(10))])
954954
tm.assert_frame_equal(result, expected, check_dtype=False)
955955

956+
def test_constructor_iterable(self):
957+
class Iter():
958+
def __iter__(self):
959+
for i in range(10):
960+
yield [1, 2, 3]
961+
962+
expected = DataFrame([[1, 2, 3]] * 10)
963+
result = DataFrame(Iter())
964+
tm.assert_frame_equal(result, expected)
965+
956966
def test_constructor_iterator(self):
957967

958968
expected = DataFrame([list(range(10)), list(range(10))])
@@ -1374,10 +1384,6 @@ def test_constructor_miscast_na_int_dtype(self):
13741384
expected = DataFrame([[np.nan, 1], [1, 0]])
13751385
tm.assert_frame_equal(df, expected)
13761386

1377-
def test_constructor_iterator_failure(self):
1378-
with tm.assert_raises_regex(TypeError, 'iterator'):
1379-
DataFrame(iter([1, 2, 3]))
1380-
13811387
def test_constructor_column_duplicates(self):
13821388
# it works! #2079
13831389
df = DataFrame([[8, 5]], columns=['a', 'a'])

pandas/tests/series/test_constructors.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,14 @@ def test_constructor_series(self):
156156

157157
assert_series_equal(s2, s1.sort_index())
158158

159-
def test_constructor_iterator(self):
159+
def test_constructor_iterable(self):
160+
class Iter():
161+
def __iter__(self):
162+
for i in range(10):
163+
yield i
160164

161165
expected = Series(list(range(10)), dtype='int64')
162-
result = Series(range(10), dtype='int64')
166+
result = Series(Iter(), dtype='int64')
163167
assert_series_equal(result, expected)
164168

165169
def test_constructor_list_like(self):

0 commit comments

Comments
 (0)