2013-09-09 5 views
3

Импорт csv с Pandas в IPython. При отображении DataFrame это выглядит следующим образом:IPython + Pandas Невозможно построить данные из .csv

 

    2013 2012 2011 2010 2009 2008 2007 2006 2005 
Jan 11,875 10,989 10,852 11,762 13,850 14,269 14,075 9,222 - 
Feb 10,206 10,501 15,713 11,785 13,886 14,289 12,635 13,149 - 
Mar 11,235 11,991 14,193 14,239 15,528 14,589 14,519 10,179 - 
Apr NaN  13,617 12,945 14,682 16,953 18,054 14,954 10,549 - 
May NaN  14,645 15,524 15,861 12,357 18,833 16,511 12,889 - 
Jun NaN  14,987 17,740 26,616 13,947 19,580 18,161 13,969 - 
Jul NaN  13,514 19,082 19,880 16,199 20,522 16,537 14,038 - 
Aug NaN  12,830 14,785 16,125 23,438 16,018 16,645 12,430 1,729 
Sep NaN  12,070 13,232 17,081 16,997 16,543 14,372 12,400 5,414 
Oct NaN  11,907 11,027 17,995 12,576 13,535 17,169 14,673 4,920 
Nov NaN  10,623 12,127 12,439 11,926 12,491 13,530 14,313 7,993 
Dec NaN  8,624 8,952 10,498 12,811 14,552 11,573 10,780 6,879 
TOTAL 33,316 146,298  166,172  188,963  180,468  193,275  180,681  148,591  26,935 

Теперь я хочу, чтобы построить данные в виде графика, но независимо от того, что я пытаюсь я получаю «TypeError: Empty„DataFrame“: нет числовых данных для построения»

Очевидно, что DataFrame не пуст и полон чисел. Что мне не хватает? У меня создалось впечатление, что Панда сам определил числа. ""

+0

Не думаю, что данные в текущей форме (как указано в вашем ответе) являются «числовыми». Я вижу «,» в данных внутри чисел. См. Http://stackoverflow.com/questions/11858472/pandas-combine-string-and-int-columns или http://stackoverflow.com/questions/16643695/pandas-convert-strings-to-float-for -multiple-columns-in-dataframe –

+0

Возможно, это связано с тем, что вы не правильно прочитали данные. Можете ли вы показать свой код (команда 'read_csv'), которую вы использовали для его чтения и (выдержка из) исходного файла csv? В 'read_csv' вы можете указать десятичный разделитель, а также значения, которые следует учитывать как NaN. – joris

ответ

3

Спасибо за все предложения! Он указал мне в правильном направлении. Мне удалось решить проблему с помощью

df = df.replace(',', '', regex=True) 
df = df.replace('-', 'NaN', regex=True).astype('float') 
df.plot() 
+0

Приятно, что вы смогли это решить! Но, как я сказал в другом комментарии, это не обязательно. Это вещи, которые вы можете легко (и лучше) обрабатывать на этапе импорта, с чем-то вроде этого '' pd.read_csv (file, decimal = ',', na_values ​​= ['-']) '' с соответствующим '' sep = '' '' значение в зависимости от ваших данных. – joris

2

Принимая ваши данные, и заменить "" на плюс "-" на "NaN", это работает:

>>> s="""  2013 2012 2011 2010 2009 2008 2007 2006 2005 
Jan 11,875 10,989 10,852 11,762 13,850 14,269 14,075 9,222 - 
Feb 10,206 10,501 15,713 11,785 13,886 14,289 12,635 13,149 - 
Mar 11,235 11,991 14,193 14,239 15,528 14,589 14,519 10,179 - 
Apr NaN  13,617 12,945 14,682 16,953 18,054 14,954 10,549 - 
May NaN  14,645 15,524 15,861 12,357 18,833 16,511 12,889 - 
Jun NaN  14,987 17,740 26,616 13,947 19,580 18,161 13,969 - 
Jul NaN  13,514 19,082 19,880 16,199 20,522 16,537 14,038 - 
Aug NaN  12,830 14,785 16,125 23,438 16,018 16,645 12,430 1,729 
Sep NaN  12,070 13,232 17,081 16,997 16,543 14,372 12,400 5,414 
Oct NaN  11,907 11,027 17,995 12,576 13,535 17,169 14,673 4,920 
Nov NaN  10,623 12,127 12,439 11,926 12,491 13,530 14,313 7,993 
Dec NaN  8,624 8,952 10,498 12,811 14,552 11,573 10,780 6,879 
TOTAL 33,316 146,298  166,172  188,963  180,468  193,275  180,681  148,591  26,935""" 

>>> s=s.replace(',','.')  
>>> s=s.replace('-','NaN')  
>>> df=pd.read_csv(StringIO(s), sep='\s*') 
>>> df.plot() 
<matplotlib.axes.AxesSubplot at 0x88a4790> 

Что-то интересное, что, из read_csv строку документации, есть аргумент, определяющий десятичный разделитель, но он не работает в моей версии (0.11.0).