Pandas dataframe: график частоты с оттенком на основе разных столбцов, которые имеют одинаковые строковые записи - PullRequest
1 голос
/ 19 июня 2020

Я анализирую этот набор данных Kaggle: https://www.kaggle.com/astronasko/transport-for-london-journey-information

Я создал DataFrame со всеми завершенными поездками, где начальная станция ('StartStn') и конечная станция ('EndStn') не совпадают, и по каждому из них есть информация.

Я создал частотный график начальных станций и отдельный частотный график конечных станций (см. Изображения ниже):

enter image description here

enter image description here

Код на рисунке 1: complete['StartStn'].value_counts()[:20].plot(kind='bar')

Код на рисунке 2 : complete['EndStn'].value_counts()[:20].plot(kind='bar')

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

IN:

complete[['StartStn','EndStn']].sample(10)

OUT:

        StartStn             EndStn
102417  Leytonstone          East Ham
995246  Walthamstow Central  Piccadilly Circus
1102327 Earls Court          Holborn
604323  Stratford            Shepherd's Bush Und
481718  Warren Street        Walthamstow Central
2344106 Marble Arch          Northolt
1234444 Colliers Wood        Holborn
1408620 Earls Court          Marble Arch
465436  Tottenham Court Rd   Mile End
1580309 Woodside Park        Hammersmith D

Как видите, многие станции, такие как 'Walthamstow Central', находятся в обоих столбцах.

Проблема:

Используя seaborn, matplotlib или pandas, как мне создать график частот для всех станций с оттенком StartStn и EndStn (т.е. на тех же осях)?

Лучшее, что я могу сделать s, чтобы создать частотный график со всеми станциями, комбинируя частоты в 'StartStn' и 'EndStn':

stations = pd.concat([complete['StartStn'],complete['EndStn']],axis=0)
stations.value_counts()[:10].plot(kind='bar')

Что дает мне следующий результат:
Самые популярные станции (начало или конец ) enter image description here

Буду очень признателен за любые предложения!

Большое спасибо,

Бени

1 Ответ

1 голос
/ 19 июня 2020

Hy Certiprince Вы можете использовать countplot из seaborn и использовать Startstn и Endstn в качестве «оттенка», чтобы на каждую станцию ​​приходилось 2 полосы. Найдите подходящий код ниже. Я пробовал с вашим образцом с 10 элементами.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

from collections import OrderedDict

columns = ['StartStn','EndStn']
startstn = ['Leytonstone','Walthamstow','Earls Court','Stratford','Warren Street','Marble Arch','Colliers Wood',
            'Earls Court','Tottenham Court Rd','Woodside Park']
endstn = ['East Ham','Piccadilly Circus','Holborn','Shepherds Bush Und','Walthamstow Central','Northolt',
          'Holborn','Marble Arch','Mile End','Hammersmith D']
df = pd.DataFrame(data={'StartStn':startstn,'EndStn':endstn})
print(df)

df['hue'] = 'Start'
df['Stations'] = df['StartStn']
df_start = df[['Stations','hue']]
df['hue'] = 'End'
df['Stations'] = df['EndStn']
df_end = df[['Stations','hue']]

orderstart = df['StartStn'].value_counts()
startstnlist = orderstart.index.tolist()
orderend = df['EndStn'].value_counts()
endstnlist = orderend.index.tolist()
order = startstnlist+endstnlist
order = list(OrderedDict.fromkeys(order))

df_concatenated = pd.concat([df_start,df_end],ignore_index=True)
sns.countplot(data=df_concatenated,x='Stations', order=order,hue='hue')
plt.show()

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

...