Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python 3 - Zip is an iterator in a pandas dataframe

I am following the Pandas tutorials

The tutorials are written using python 2.7 and I am doing them in python 3.4

Here is my version details.

In [11]: print('Python version ' + sys.version)
Python version 3.4.1 |Anaconda 2.0.1 (64-bit)| (default, Jun 11 2014, 17:27:11)
[MSC v.1600 64 bit (AMD64)]

In [12]: print('Pandas version ' + pd.__version__)
Pandas version 0.14.1

I create the zip as per the tutorial

In [13]: names = ['Bob','Jessica','Mary','John','Mel']

In [14]: births = [968, 155, 77, 578, 973]

In [15]: zip?
Type:            type
String form:     <class 'zip'>
Namespace:       Python builtin
Init definition: zip(self, *args, **kwargs)
Docstring:
zip(iter1 [,iter2 [...]]) --> zip object

Return a zip object whose .__next__() method returns a tuple where
the i-th element comes from the i-th iterable argument.  The .__next__()
method continues until the shortest iterable in the argument sequence
is exhausted and then it raises StopIteration.

In [16]: BabyDataSet = zip(names,births)

But after creation the first error shows that I cannot see the contents of the zip.

In [17]: BabyDataSet
Out[17]: <zip at 0x4f28848>

In [18]: print(BabyDataSet)
<zip object at 0x0000000004F28848>

Then when I go to create the dataframe I get this iterator error.

In [21]: df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-636a49c94b6e> in <module>()
----> 1 df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])

c:\Users\Sayth\Anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self
, data, index, columns, dtype, copy)
    255                                          copy=copy)
    256         elif isinstance(data, collections.Iterator):
--> 257             raise TypeError("data argument can't be an iterator")
    258         else:
    259             try:

TypeError: data argument can't be an iterator

In [22]:

Is this a python 3 gotcha where I need to do it differently? Or other?

like image 326
sayth Avatar asked Sep 30 '14 12:09

sayth


People also ask

Is zip an iterator Python?

Python zip() FunctionThe zip() function returns a zip object, which is an iterator of tuples where the first item in each passed iterator is paired together, and then the second item in each passed iterator are paired together etc.

Does zip return an iterator?

zip() can receive multiple iterables as input. It returns an iterator that can generate tuples with paired elements from each argument.

What does zip (*) do in Python?

The zip() function combines the contents of two or more iterables. zip() returns a zip object. This is an iterator of tuples where all the values you have passed as arguments are stored as pairs. Python's zip() function takes an iterable—such as a list, tuple, set, or dictionary—as an argument.

Is zip a tuple?

12.5 Lists and tupleszip is a built-in function that takes two or more sequences and “zips” them into a list of tuples where each tuple contains one element from each sequence. In Python 3, zip returns an iterator of tuples, but for most purposes, an iterator behaves like a list.


1 Answers

You need to change this line:

BabyDataSet = zip(names,births)

to:

BabyDataSet = list(zip(names,births))

This is because zip now returns an iterator in python 3, hence your error message. For more details see: http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html#zip and https://docs.python.org/3/library/functions.html#zip

like image 70
EdChum Avatar answered Oct 13 '22 15:10

EdChum