“Ни один из [Index([«, «], dtype =’object’)] не находится в [столбцах]” при построении линейных графиков с использованием matplotlib

#python #pandas #matplotlib

#python #pandas #matplotlib

Вопрос:

Я пытаюсь построить линию, используя данные иммиграции в Канаду. Мой код приведен ниже…

 import pandas as pd

df_canada = pd.read_excel('Canada.xlsx', sheet_name = 'Canada by Citizenship (2)') 


df_canada.set_index('OdName', inplace = True)

import matplotlib.pyplot as plt

years = list (map(str, range(1980, 2014)))
df_canada['Total'] = df_canada[1980]   df_canada[1981]  df_canada[1982]  df_canada[1983]  df_canada[1984]  df_canada[1985]  df_canada[1986]  df_canada[1987]  df_canada[1988]  df_canada[1989]  df_canada[1990]  df_canada[1991]  df_canada[1992]  df_canada[1993]  df_canada[1994]  df_canada[1995]  df_canada[1996]  df_canada[1997]  df_canada[1998]  df_canada[1999]  df_canada[2000]  df_canada[2001]  df_canada[2002]  df_canada[2003]  df_canada[2004]  df_canada[2005]  df_canada[2006]  df_canada[2007]  df_canada[2008]  df_canada[2009]  df_canada[2010]  df_canada[2011]  df_canada[2012]   df_canada[2013] 


df_canada.loc['Haiti', years].plot(kind = 'line')

plt.title('Immigration from Albania')
plt.ylabel('Number of Immigrants')
plt.xlabel('years')

plt.show()
  

Но код выдает ошибку «KeyError: «Ни один из [Index([‘1980’, ‘1981’, ‘1982’, ‘1983’, ‘1984’, ‘1985’, ‘1986’, ‘1987’, ‘1988’, n ‘1989’, ‘1990’, ‘1991’, ‘1992’, ‘1993’, ‘1994’, ‘1995’, ‘1996’, ‘1997’, n ‘1998’, ‘1999’, ‘2000’, ‘2001’, ‘2002’, ‘2003’, ‘2004’, ‘2005’, ‘2006’, n ‘2007’, ‘2008’, ‘2009’, ‘2010’, ‘2011’, ‘2012’, ‘2013’], n dtype=’object’)] находятся в [индексе]»» выполнение строки»df_canada.loc[‘Гаити’, годы].участок (вид = ‘строка’)»

Кто-нибудь может помочь мне исправить код?? Заранее спасибо.

Ответ №1:

Вот рабочее решение вашей проблемы. Вы всегда можете использовать iloc для доступа к столбцам через числа:

 import pandas as pd
import matplotlib.pyplot as plt
  
df_canada = pd.read_excel('Canada.xlsx', sheet_name = 'Canada by Citizenship (2)')

#summing all the years in one line instead of typing years individually. Years start from column 9.
df_canada['total'] = df_canada.iloc[:,9:].sum(axis=1)

#Filtering the data country in standard pandas style and select column 9 to second last column (last column is total)
df_canada[df_canada['OdName']=='Haiti'].iloc[:,9:-1].T.plot(kind = 'line')


plt.title('Immigration from Haiti')
plt.ylabel('Number of Immigrants')
plt.xlabel('years')
plt.legend(['number'])
plt.show()
  

Вывод:

введите описание изображения здесь

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

1. Я не знаю, почему это не получило больше голосов, но ваше решение насчитывает десятки других, которые не сработали, наконец, решило проблему для меня. Спасибо!!

2. @ES Спасибо за добрые слова, приятель! Рад, что смог помочь. Спасибо за поддержку. Счастливого кодирования!

Ответ №2:

Вы преобразовали свой список years в список строк (например ["1980", 1981", ...] ), однако, похоже, что ваши столбцы в вашем фрейме данных представляют собой целые числа (например, 1980 — НЕ «1980»). Попробуйте изменить свою years переменную на просто years = list(range(1980, 2014))

Кроме того, вы также можете упростить свои total вычисления.

 import pandas as pd

df_canada = pd.read_excel('Canada.xlsx', sheet_name = 'Canada by Citizenship (2)') 


df_canada.set_index('OdName', inplace = True)

import matplotlib.pyplot as plt

# Change years to be integers instead of strings
years = list(range(1980, 2014)) 

# Simply sum across the years using our list of years instead of manually typing each year
df_canada['Total'] = df_canada[years].sum(axis=1) 


df_canada.loc['Haiti', years].plot(kind = 'line')

plt.title('Immigration from Albania')
plt.ylabel('Number of Immigrants')
plt.xlabel('years')

plt.show()