pandas 如何为所有列的值计数生成堆叠条形图

bf1o4zei  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(95)

我的 Dataframe 有10多列,每列都有值,如yes/no/na/not specified。
我想计算每一列中的出现次数并创建堆叠条形图。
下面是我需要的图像:

uz75evzq

uz75evzq1#

是的,这是可能的。但是您需要先稍微重新格式化数据。
这是我在这个例子中使用的数据集,它在列中有标签,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

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

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

现在,您已经准备好绘制数据了。下面的代码可以实现这一点:

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

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

附录

生成测试数据集的代码:

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()
})

相关问题