График Pandas с индексом вызывает «KeyError [] не в индексе»

#python #pandas #plot

#python #pandas #график

Вопрос:

Я очень новичок в концепции Pandas в Python. Обычно графики не являются проблемой. Однако теперь я столкнулся с фреймом данных, который содержит индекс. Почему-то больше ничего не работает.

Чего я хочу добиться: создайте подзаголовок для каждого столбца [Plant1, Plant2, Plant3] для одного конкретного столбца [Trafo1].

Вот мой код:

 import numpy as np
import datetime
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import os

# Create the sample data

plant1 = {'Date' : pd.date_range('1/1/2011', periods=10, freq='D'),
     'Plant' : pd.Series(["Plant1"]*10),
     'Output' : pd.Series(abs(np.random.randn(10)))}

plant2 = {'Date' : pd.date_range('1/3/2011', periods=10, freq='D'),
     'Plant' : pd.Series(["Plant2"]*10),
     'Output' : pd.Series(abs(np.random.randn(10)))}

plant3 = {'Date' : pd.date_range('1/5/2011', periods=10, freq='D'),
     'Plant' : pd.Series(["Plant3"]*10),
     'Output' : pd.Series(abs(np.random.randn(10)))}     

trafo1 = {'Date' : pd.date_range('1/5/2011', periods=10, freq='D'),
     'Plant' : pd.Series(["Trafo1"]*10),
     'Output' : pd.Series(abs(np.random.randn(10)))}          

trafo2 = {'Date' : pd.date_range('1/5/2011', periods=10, freq='D'),
     'Plant' : pd.Series(["Trafo2"]*10),
     'Output' : pd.Series(abs(np.random.randn(10)))}          



df_plant_1 = pd.DataFrame(plant1)
df_plant_2 = pd.DataFrame(plant2)
df_plant_3 = pd.DataFrame(plant3)
df_trafo_1 = pd.DataFrame(trafo1)
df_trafo_2 = pd.DataFrame(trafo2)


sample = pd.concat([df_plant_1,df_plant_2,df_plant_3,df_trafo_1,df_trafo_2])
test = pd.pivot_table(sample, index='Date', columns='Plant', values='Output')
test = test.fillna(method='pad')                            
test = test.fillna(method='bfill')     



# Draw the plots

matplotlib.style.use('ggplot')

cols = len(test.columns) - 1

fig, axes = plt.subplots(nrows=cols/2, ncols=2, figsize=(12, 4))
for column in test.iloc[:,:-1]:
    test.plot(x=test[column], y=test['Trafo1'], title=column)
    plt.gca().set_aspect('equal', adjustable='box')
    plt.show()
  

В результате выводится следующая ошибка:

 runfile('C:/..../untitled12.py', wdir='C:/...')


Traceback (most recent call last):

  File "<ipython-input-206-1acb55933d7f>", line 1, in <module>
    runfile('C:/Users/bjl/untitled12.py', wdir='C:/Users/bjl')

  File "C:Anaconda2libsite-packagesspyderlibwidgetsexternalshellsitecustomize.py", line 699, in runfile
    execfile(filename, namespace)

  File "C:Anaconda2libsite-packagesspyderlibwidgetsexternalshellsitecustomize.py", line 74, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "C:/Users/bjl/untitled12.py", line 52, in <module>
    test.plot(x=test[column], y=test['Trafo1'], title=column)

  File "C:Anaconda2libsite-packagespandastoolsplotting.py", line 3671, in __call__
    sort_columns=sort_columns, **kwds)

  File "C:Anaconda2libsite-packagespandastoolsplotting.py", line 2556, in plot_frame
    **kwds)

  File "C:Anaconda2libsite-packagespandastoolsplotting.py", line 2370, in _plot
    series = data[y].copy()  # Don't modify

  File "C:Anaconda2libsite-packagespandascoreframe.py", line 1963, in __getitem__
    return self._getitem_array(key)

  File "C:Anaconda2libsite-packagespandascoreframe.py", line 2007, in _getitem_array
    indexer = self.ix._convert_to_indexer(key, axis=1)

  File "C:Anaconda2libsite-packagespandascoreindexing.py", line 1150, in _convert_to_indexer
    raise KeyError('%s not in index' % objarr[mask])

KeyError: '[ 1.20311253  1.20311253  1.20311253  1.20311253  1.20311253  0.32765014n  1.65686117  2.58118029  0.58903059  0.13907876  0.59270297  0.27072611n  0.50167366  1.0310578 ] not in index'
  

Я не понимаю, в чем проблема с индексом, по-видимому. Я не смог найти никакой справки в Интернете, поскольку все примеры работают без индекса.

Я действительно ценю вашу помощь. Ошибка является загадочной для новичков.

Ответ №1:

Согласно документам, вы должны указывать имена столбцов, а не сами столбцы при построении графика таким образом. Итак, замена:

 test.plot(x=test[column], y=test['Trafo1'], title=column)
  

с

 test.plot(x=column, y='Trafo1', title=column)
  

должно устранить эту ошибку.

РЕДАКТИРОВАТЬ: Что касается подзаголовка, чтобы поместить его в правильный подзаголовок, вы должны указать ось, по которой вы хотите, чтобы ваш график заканчивался. Вы могли бы сделать это следующим образом:

 for i, column in enumerate(test.iloc[:, :-2]):
    j = i // 2
    k = i % 2
    test.plot(x=column, y='Trafo1', title=column, ax=axes[j][k])
  

Теперь выполните операцию, которую вы хотели, по всем осям (хотя это действительно портит ситуацию)

 for ax in axes.reshape(4):
    ax.set_aspect('equal', adjustable='box')
  

Показывать графики 🙂

 plt.show()
  

Комментарии:

1. Вероятно, мне следует забронировать отпуск : (

2. @lammy случается с лучшими из нас ;). Я также исправил подзаголовок в моей следующей правке, но я еще не понял, как сделать set_aspect штуковину на правой оси. С этого момента это не должно быть так сложно!

3. Если вы могли бы это сделать, я также забронирую ваше место 🙂 В настоящее время я пытаюсь создать подзаголовки с итерацией по фрейму данных, как описано. Пока безуспешно. В один из таких дней … 😉

4. Все сделано 🙂 Однако штука set_aspect действительно уродлива, так что я предполагаю, что это было не совсем то, чего вы хотели. Куда мы поедем в наш отпуск?