繁体   English   中英

如何为所有列的值计数生成堆积条 plot

[英]How to produce a stacked bar plot for the value counts of all columns

我的 dataframe 有超过 10 列,每列都有诸如 yes/no/na/not specified 之类的值。

我想计算每列中出现的次数并创建堆积条形图。

下面是我需要的图像:

堆叠条形图

是的,这是可能的。 但是您需要先重新格式化您的数据。

这是我在此示例中使用的数据集。 它在列中有标签,并以 1000 个随机的是、否或可能的响应作为值。

    asthma boneitis diabetes pneumonia
0       No       No      Yes     Maybe
1       No       No       No       Yes
2       No       No       No        No
3      Yes       No       No     Maybe
4      Yes       No       No     Maybe
..     ...      ...      ...       ...
995     No       No      Yes        No
996  Maybe      Yes      Yes       Yes
997     No       No       No       Yes
998     No       No       No        No
999     No       No    Maybe        No

为了正确格式化 plot 的数据,请执行以下操作:

df2 = df.stack().groupby(level=[1]).value_counts().unstack()
# Preferred order of stacked bar elements
stack_order = ['Yes', 'Maybe', 'No']
df2 = df2[stack_order]

此时,数据看起来是这样的:

           Yes  Maybe   No
asthma      83     83  834
boneitis   174    173  653
diabetes   244    260  496
pneumonia  339    363  298

现在您已准备好 plot 数据。 这是执行此操作的代码:

df2.plot.bar(rot=0, stacked=True)

我使用rot=0来避免旋转文本标签(它们通常呈 45 度角),并使用stacked=True来生成堆叠条形图。

plot 看起来像这样:

堆叠条形图

附录

生成测试数据集的代码:

import pandas as pd
import numpy as np

categories = [
    'asthma',
    'boneitis',
    'diabetes',
    'pneumonia',
]

distribution = {
    cat: (i + 1) / 12
    for i, cat in enumerate(categories)
}

df = pd.DataFrame({
    cat: np.random.choice(['Yes', 'Maybe', 'No'], size=1000, p=[prob, prob, 1 - 2 * prob])
    for cat, prob in distribution.items()
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM