2014-08-05 2 views
1

Я пытаюсь создать DataFrame со следующим:Python 3.4, ошибка при создании DataFrame с пандой

from pandas import DataFrame, read_csv 

import matplotlib.pyplot as plt 
import pandas as pd 
import sys 

# The inital set of baby names and birth rates 
names =['Bob','Jessica','Mary','John','Mel'] 
births = [968, 155, 77, 578, 973] 

#Now we wil zip them together 
BabyDataSet = zip(names,births) 
    ##we have to add the 'list' for version 3.x 
print (list(BabyDataSet)) 

#create the DataFrame 
df = DataFrame(BabyDataSet, columns = ['Names', 'Births']) 
print (df) 

, когда я запускаю программу, я получаю следующее сообщение об ошибке: «тип данных не может быть итератор ' Я читал следующее:' What does the "yield" keyword do in Python? ', но я не понимаю, как это относится к тому, что я делаю. Будем очень благодарны за любую помощь и дальнейшее понимание.

ответ

1

В python 3, zip возвращает итератор, а не такой список, как в python 2. Просто преобразуйте его в список при построении DataFrame, как это.

df = DataFrame(list(BabyDataSet), columns = ['Names', 'Births']) 
+0

Я подумал, что может это исправить, но это только дало мне другую ошибку, «форма переданных значений (0,0), индексы следует (2,0) Так я думал, что я делаю неправильно. Может ли это указать на проблему с моим файлом pandas? –

+1

Я считаю, что проблема заключается в том, что BabyDataSet создается в качестве генератора, поэтому строка 'print (list (BabyDataSet))' есть '. Помните, что генераторы могут повторяться только один раз. Просто удалите эту строку, чтобы исправить это. Вероятно, вам следует сохранить его как список, когда вы его инициализируете, чтобы случайно не использовать генератор: 'BabyDataSet = list (zip (имена, роды))' –

+0

@ rfan Это фиксировало вторую ошибку, и я смог создать мой df, благодаря вам обоим. :) p.s как мне добавить полезный комментарий? –

1

Вы также можете создать dataframe, используя альтернативный синтаксис, который полностью исключает проблему с zip-генератором.

df = DataFrame({'Names': names, 'Births': births}) 

Читать documentation на инициализирующих dataframes. Pandas просто берет словарь, создает по одному столбцу для каждой записи с ключом как имя и значение в качестве значения.

Dict can contain Series, arrays, constants, or list-like objects

+0

Не могли бы вы объяснить логику или дать ссылку относительно того, как это работает? –

+0

Отредактировано, хотя и не уверен, насколько это полезно. Я нахожу это довольно интуитивно понятным, dataframe будет инициализироваться именами столбцов в качестве ключей в словаре и любой итерабельной или постоянной, как значения столбца. –

Смежные вопросы