如何制作分类列计数子集的条形图?
Posted
技术标签:
【中文标题】如何制作分类列计数子集的条形图?【英文标题】:How do i make Bar Chart of a subset of counts of categorical Column? 【发布时间】:2020-09-18 06:12:47 【问题描述】:我有一个 FIFA 19 数据集,其中包含来自 100 多个国家/地区的 1000 多名球员的数据。我想制作一个条形图,显示玩家数量大于 3 的民族分布。这是我尝试过的:
nation = fifa_19[fifa_19['Nationality'].value_counts()>=3]
plt.figure(figsize=(30, 15))
sns.set(style="whitegrid")
sns.countplot(nation, order = fifa_19['Nationality'].value_counts().index)
plt.title('Distribution of Nationalities of players')
plt.xlabel('Nationality')
plt.ylabel('Frequency')
我得到这个错误:
IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
我正在制作一个示例 DataFrame 并将其添加到此处。
fifa_19 = pd.DataFrame('Player':['A','B','C','D','E','F','E','G','H'],'Nationality':['USA','USA','USA','Canada','Pakistan','India', 'Brazil','Brazil','Brazil'])
如果有人可以帮助我,那就太好了。
【问题讨论】:
【参考方案1】:问题在于,在您的代码中,.value_counts()
系列不能用作fifa_19
数据帧的索引。而是:
nation = fifa_19['Nationality'].value_counts()
nation = nation.loc[nation >= 3]
plt.figure(figsize=(30, 15))
sns.set(style="whitegrid")
sns.barplot(data=nation, x="Country", y="Frequency", order = fifa_19['Nationality'].value_counts().index)
plt.title('Distribution of Nationalities of players')
plt.xlabel('Nationality')
plt.ylabel('Frequency')
注意:如果您不希望不满足 3 人阈值的国籍的空值,请更改此行:
sns.barplot(data=nation, x="Country", y="Frequency", order = fifa_19['Nationality'].value_counts().index)
到
order = pd.DataFrame(fifa_19['Nationality'].value_counts().index).join(nation["Country"], how="inner")["Country"]
sns.barplot(data=nation, x="Country", y="Frequency", order = order)
【讨论】:
我尝试了你的建议,我得到了结果,但它是一个显示玩家数量分布的条形图。例如,如果 2 个国家有 156 名玩家。那么横轴是“156”,纵轴是2。我希望是国籍的分布。 将sns.barplot...
替换为sns.countplot(nation["Frequency"])
。尽管那时您的 x 和 y 标签没有意义/需要更改。
我仍然有问题,但我想通了。问题是 sns.countplot(),我不需要在 sns.countplot() 中使用 value_counts(),因为 countplot 本身就是这样做的。 value_counts() 将与 sns.barplot() 一起使用,但仅在重置索引后才能使用,因此我有 2 个不同的列。以上是关于如何制作分类列计数子集的条形图?的主要内容,如果未能解决你的问题,请参考以下文章