python Диаграмма с накоплением - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь создать диаграмму областей с накоплением, показывающую эволюцию курсов и их количество с течением времени. Поэтому мой фрейм данных (индекс = год):

                    Area  Courses
Year                             
1900         Agriculture      0.0
1900        Architecture     32.0
1900           Astronomy     10.0
1900             Biology     20.0
1900           Chemistry     25.0
1900   Civil Engineering     21.0
1900           Education     14.0
1900  Engineering Design     10.0
1900             English     30.0
1900           Geography      1.0

В прошлом году: 2011.

Я пробовал несколько решений, таких как df.plot.area (), df.plot. площадь (х = 'лет'). Тогда я подумал, что было бы полезно иметь Области в качестве столбцов, поэтому я попытался

df.pivot_table(index = 'Year', columns = 'Area', values = 'Courses', aggfunc = 'sum')

, но вместо того, чтобы получать сумму курсов в год, я получил:

Area  Aeronautical Engineering  ...  Visual Design
Year                            ...               
1900                       NaN  ...            NaN
1901                       NaN  ...            NaN

Спасибо за вашу помощь , Это мой первый пост. Извините, если я что-то пропустил.

Обновление. Вот мой код:

df = pd.read_csv(filepath, encoding= 'unicode_escape')
df = df.groupby(['Year','GenArea'])['Taught'].sum().to_frame(name = 'Courses').reset_index()
plt.stackplot(df['Year'], df['Courses'], labels = df['GenArea'])
plt.legend(loc='upper left')
plt.show()

А вот ссылка на набор данных: https://data.world/makeovermonday/2020w12

1 Ответ

1 голос
/ 25 марта 2020

С дополнительной информацией я сделал это. Надеюсь, вам понравится!

import pandas as pd
import matplotlib.pyplot as plt

plt.close('all')

df=pd.read_csv('https://query.data.world/s/djx5mi7dociacx7smdk45pfmwp3vjo',
               encoding='unicode_escape')
df=df.groupby(['Year','GenArea'])['Taught'].sum().to_frame(name=
             'Courses').reset_index()
aux1=df.duplicated(subset='GenArea', keep='first').values
aux2=df.duplicated(subset='Year', keep='first').values

n=len(aux1);year=[];courses=[]

for i in range(n):
    if not aux1[i]:
        courses.append(df.iloc[i]['GenArea'])
    if not aux2[i]:
        year.append(df.iloc[i]['Year'])
    else:
        continue

del aux1,aux2
df1=pd.DataFrame(index=year)
s=0

for i in range(len(courses)):
    df1[courses[i]]=0
for i in range(n):
    string=df.iloc[i]['GenArea']
    if any(df1.iloc[s].values==0):
        df1.at[year[s],string]=df.iloc[i]['Courses']
    else:
        s+=1
        df1.at[year[s],string]=df.iloc[i]['Courses']

del year,courses,df
df1=df1[df1.columns[::-1]]
df1.plot.area(legend='reverse')

Example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...