Группировка Pandas и построение графика

В результате конкатенации нескольких датафреймов по дате и прилету-вылету получилась таблица ar_dp_concat вида:

Date Status hours Flights
02.16 Arriv 00 25
02.16 Arriv 01 98
02.16 Arriv 02 45
02.16 Depart 01 26
02.16 Depart 02 99
02.17 Arriv 00 100
02.17 Arriv 04 101
02.17 Depart 01 55
02.17 Depart 03 30
02.17 Depart 04 99

По этой таблице надо построить диаграмму прилета-вылета по датам и часам

Мой код:

ar_dp_concat_grouped = ar_dp_concat.groupby([ 'Date','Status', 'hours']).agg({'Flights':'count'}).sort_values(by=[ 'Date', 'Status','hours'], ascending=[True, True, True])
ar_dp_concat_grouped.plot(kind='bar',
                          xlabel='Time',
                          ylabel='Quantity')

for i, val in enumerate(ar_dp_concat_grouped.values):
    plt.text(i, val, int(val), horizontalalignment='center', verticalalignment='bottom', fontdict={'size':8})`

дает четыре разных графика на одной оси. И вообще, я сомневаюсь в верности своей группировки.

Сначала я работала с 2-мя разными таблицами - Arriv и Depart, но тогда графики вообще получаются на разных осях.

А мне надо наложение Arriv на Depart по датам и часам в одних осях, разным цветом.

Это возможно? и как это сделать?

Комментарий: вопрос

Большое спасибо, второй вариант как раз то, что мне нужно! … но на моей таблице почему-то не работает…

Date    Status  hours   Flights

0   02.16.2024  Arrival 00  AA 1704

1   02.16.2024  Arrival 00  NK 1166

2   02.16.2024  Arrival 01  NK 3801

3   02.16.2024  Arrival 04  AA 2841

4   02.16.2024  Arrival 05  AA 2821

... ... ... ... ...

1397    02.17.2024  Departure   22  AA 5823

1398    02.17.2024  Departure   22  NK 980

1399    02.17.2024  Departure   22  AA 5281

1400    02.17.2024  Departure   22  AA 1644

1401    02.17.2024  Departure   23  AA 494

2802 rows × 4 columns

С датами на самом деле все в порядке, а вот с индексом не понятно - если я применяю ваш код к моим данным

    ar_dp_concat[['Date','Status', 'Flights']].pivot_table(columns='Status',index='Date', values='Flights').plot(kind='bar',color=['b','r'])
    plt.show()

TypeError: no numeric data to plot

В чем у меня ошибка?


Ответы (1 шт):

Автор решения: Алексей Р

Переделал под новые данные, где в Flights - номера рейсов. Агрегирующая функция в pivot_table - количество.

import matplotlib.pyplot as plt

ar_dp_concat = pd.DataFrame({'Date': ['02.16.2024', '02.16.2024', '02.16.2024', '02.16.2024', '02.16.2024', '02.17.2024', '02.17.2024', '02.17.2024', '02.17.2024', '02.17.2024'],
                             'Status': ['Arrival', 'Arrival', 'Arrival', 'Arrival', 'Arrival', 'Departure', 'Departure', 'Departure', 'Departure', 'Departure'],
                             'hours': [0, 0, 1, 4, 5, 22, 22, 22, 22, 23],
                             'Flights': ['AA 1704', 'NK 1166', 'NK 3801', 'AA 2841', 'AA 2821', 'AA 5823', 'NK 980', 'AA 5281', 'AA 1644', 'AA 494']},
                            index=[0, 1, 2, 3, 4, 1397, 1398, 1399, 1400, 1401])
ar_dp_concat.Date = pd.to_datetime(ar_dp_concat.Date.add(' ').add(ar_dp_concat.hours.astype(str)), format='%m.%d.%Y %H')
ar_dp_concat[['Date', 'Status', 'Flights']].pivot_table(columns='Status', index='Date', values='Flights', aggfunc='count').plot(kind='bar', color=['b', 'r'])
plt.show()

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

→ Ссылка