Pandas гистограмма сгруппирована по нескольким атрибутам - PullRequest
2 голосов
/ 04 апреля 2020

У меня есть датафрейм, который содержит количество пассажиров на каждой остановке, для каждой поездки на автобусе и для каждого дня.

Я хотел бы построить гистограмму, которая показывает количество пассажиров для всех различных комбинаций [trip_id, day], отсортированных по времени вылета.

Приведенный ниже минимальный пример дает ожидаемый результат:

import pandas as pd
import random

# Dummy dataframe where:
# day = day of operation
# line = bus line number
# trip = the trip ID
# dep_time = departure time
# stop_name = the stop name
# load = number of passenger at each stop
d = {'day': ['Fri'] * 6 + ['Sat'] * 6 + ['Fri'] * 6 + ['Sat'] * 6,
     'line': [1] * 12 + [2] * 12,
     'trip': [1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8],
     'dep_time': list(range(1, 7)) * 4,
     'stop_name': ['George Street', 'Casino', 'Beauregard'] * 4 + ['Virginia Street', 'Monbenont', 'Baker street'] * 4,
     'load': [random.randint(1, 10) for x in range(24)]}
df = pd.DataFrame(data=d)

# Get the unique day and trip ID
uday = df['day'].unique().tolist()
utrip = df['trip'].unique().tolist()

# For each group of distinct [day,trip] plot an histogram of the number of passenger at each stop
# and sort the stop by departure time.
for day in uday:
    for trip in utrip:
        # Filter the dataframe for each unique day, trip ID and direction.
        df_to_plot = df.sort_values('dep_time')[(df['day'] == day) & (df['trip'] == trip)]
        if not df_to_plot.empty:
            title = 'line: ' + str(df_to_plot['line'].unique()[0]) \
                    + ', ' \
                    + 'trip_id: ' + str(trip) \
                    + ' ' \
                    + day

            ax = df_to_plot.plot.bar(x='stop_name', y='load', rot=90, title=title)

Этот код производит 8 гистограмм, но я должен создать al oop для каждой группы. Есть ли способ получить тот же результат, используя какую-то функцию group_by с pandas?

1 Ответ

2 голосов
/ 04 апреля 2020

IIU C, да, это можно сделать с помощью groupby:

for (d,t), v in df.sort_values('dep_time').groupby(['day','trip']):
    # your other plot commands here:
    if len(v):
        v.plot.bar(x='stop_name',y='load')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...