5

我有一个包含几个分类列的数据框。我知道如何做 countplot 常规地绘制一列。问:如何在一个图中绘制所有列的最大计数?

这是一个用于澄清问题的示例性数据框:

import pandas as pd
import numpy as np
import seaborn as sns

testdf=pd.DataFrame(({   'Ahome' :   pd.Categorical(["home"]*10),
                         'Bsearch' : pd.Categorical(["search"]*8 + ["NO"]*2),
                          'Cbuy' : pd.Categorical(["buy"]*5 + ["NO"]*5),
                          'Dcheck' : pd.Categorical(["check"]*3 + ["NO"]*7),


                     } ))
testdf.head(10)
sns.countplot(data=testdf,x='Bsearch');

最后一行只是对一列使用正常的计数图。我想在 x 轴上有列类别(家庭、搜索、购买和检查),在 y 轴上有它们的频率。

提前致谢!

4

2 回答 2

6

您需要使用countplot如下:

df = pd.melt(testdf)
sns.countplot(data=df.loc[df['value']!="NO"], x='variable', hue='value')

输出:

在此处输入图像描述

于 2018-07-06T13:46:00.077 回答
4

正如@HarvIpan 指出的那样,使用melt您将创建一个以列名作为条目的长格式数据框。调用countplot此数据框会产生正确的绘图。

作为与现有解决方案的不同之处,我建议根本不要使用该hue参数。

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

df=pd.DataFrame(({   'Ahome' :   pd.Categorical(["home"]*10),
                         'Bsearch' : pd.Categorical(["search"]*8 + ["NO"]*2),
                          'Cbuy' : pd.Categorical(["buy"]*5 + ["NO"]*5),
                          'Dcheck' : pd.Categorical(["check"]*3 + ["NO"]*7),


                     } ))

df2 = df.melt(value_vars=df.columns)
df2 = df2[df2["value"] != "NO"]
sns.countplot(data=df2, x="variable")
plt.show()

在此处输入图像描述

于 2018-07-06T15:04:15.773 回答