Pandas 数据框:基于共享相同字符串条目的不同列的色调频率图

Posted

技术标签:

【中文标题】Pandas 数据框:基于共享相同字符串条目的不同列的色调频率图【英文标题】:Pandas dataframe: Frequency plot with hue based on different columns that share same string entries 【发布时间】:2020-10-10 00:02:42 【问题描述】:

我正在分析这个 Kaggle 数据集:https://www.kaggle.com/astronasko/transport-for-london-journey-information

我创建了一个包含所有已完成旅程的 DataFrame,其中起点站 ('StartStn') 和终点站 ('EndStn') 不同,并且每个都有信息。

我已经创建了起始站的频率图和结束站的单独频率图(见下图):

图1代码: complete['StartStn'].value_counts()[:20].plot(kind='bar')

图2代码: complete['EndStn'].value_counts()[:20].plot(kind='bar')

这是数据框的一个示例,仅取这两列的子集:

输入:

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

输出:

        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 色调(即在同一轴上)的站点创建频率图?

我能做的最好的事情是创建一个包含所有电台的频率图,结合“StartStn”和“EndStn”中的频率:

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

这给了我以下输出:最受欢迎的电台(开始或结束)

如果有任何建议,将不胜感激!

非常感谢,

贝尼

【问题讨论】:

【参考方案1】:

Hy Certiprince 您可以使用 seaborn 的 countplot 并将 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()

编辑: 我已经包含了一段代码,以便对图表进行排序,并且顺序由 startstation 频率给出

【讨论】:

以上是关于Pandas 数据框:基于共享相同字符串条目的不同列的色调频率图的主要内容,如果未能解决你的问题,请参考以下文章

pandas 学习 第1篇:pandas基础

基于针对另一列的参考表更新 Pandas 数据框列的问题

Pandas 数据框中每年的条目总数

获取熊猫数据框列表条目中的数字条目

在 Pandas 数据框中过滤多个列以获取相同的字符串

Pandas Groupby:同一列上的聚合,但总计基于两个不同的标准/数据框