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 数据框:基于共享相同字符串条目的不同列的色调频率图的主要内容,如果未能解决你的问题,请参考以下文章