#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()