熊猫:数列中的海洋计数图

时间:2018-07-06 13:30:01

标签: python pandas seaborn

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

下面是一个示例数据框,用于阐明问题:

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轴上显示它们的频率。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

您需要按以下方式使用countplot

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

输出:

enter image description here

答案 1 :(得分:1)

正如@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()

enter image description here