2014-09-30 12 views
15

sto seguendo il Pandas tutorialsPython 3 - Zip è un iteratore in un dataframe panda

I tutorial sono scritti utilizzando Python 2.7 e sto li facendo in python 3.4

Ecco i miei dati di versione.

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 

creo la cerniera secondo il 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) 

Ma dopo la creazione del primo errore mostra che non riesco a vedere il contenuto del zip.

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

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

Poi quando vado a creare il dataframe ottengo questo errore di iteratore.

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]: 

Si tratta di un trucco di Python 3 in cui ho bisogno di farlo in modo diverso? O altro?

+1

cambiare linea per questo: 'BabyDataSet = dict (zip (nomi, nascite))' ' – EdChum

+3

zip' cambiato in python 3 restituisce un iteratore ora: http: // www. diveintopython3.net/porting-code-to-python-3-with-2to3.html#zip quindi devi passarlo a un costruttore di dict nel tuo caso – EdChum

risposta

23

è necessario modificare questa riga:

BabyDataSet = zip(names,births) 

a:

BabyDataSet = list(zip(names,births)) 

Questo perché zip ora restituisce un iteratore in Python 3, quindi il messaggio di errore. Per maggiori dettagli si veda: http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html#zip e https://docs.python.org/3/library/functions.html#zip

+0

Grazie in realtà dovevo scriverlo come BabyDataSet = list (zip (nomi, nascite) Altrimenti il ​​dataframe non caricava un dettt richiedeva una lista – sayth

+0

@sayth ah sì, non ho notato che il costruttore DataFrame ha passato il parametro 'columns'. – EdChum

Problemi correlati