【问题标题】:Stacked bar plot by grouped data with pandas使用 pandas 分组数据的堆积条形图
【发布时间】:2016-01-21 07:28:09
【问题描述】:

假设我有 pandas 数据框,它有很多特性,我对两个感兴趣。我会打电话给他们feature1feature2

feature1 可以有三个可能的值。 feature2 可以有两个可能的值。

我需要按feature1 分组的条形图,并按行数堆叠,每个值为feature2。 (所以会有三个堆栈,每个堆栈有两个条)。

如何做到这一点?

目前有

import pandas as pd
df = pd.read_csv('data.csv')
df['feature1'][df['feature2'] == 0].value_counts().plot(kind='bar',label='0')
df['feature1'][df['feature2'] == 1].value_counts().plot(kind='bar',label='1')

但这不是我真正想要的,因为它不会堆叠它们。

【问题讨论】:

标签: python pandas plot


【解决方案1】:

另外,我找到了另一种方法(使用 pandas):

df.groupby(['feature1', 'feature2']).size().unstack().plot(kind='bar', stacked=True)

来源: making a stacked barchart in pandas

【讨论】:

  • size()unstack() 有什么作用?谢谢。
  • 简单干净!
【解决方案2】:

我不确定如何在 matplotlib(pandas 默认绘图库)中执行此操作,但如果您愿意尝试不同的绘图库,使用 Bokeh 很容易做到。

这是一个例子

import pandas as pd
from bokeh.charts import Bar, output_file, show
x = pd.DataFrame({"gender": ["m","f","m","f","m","f"],
                  "enrolments": [500,20,100,342,54,47],
                  "class": ["comp-sci", "comp-sci",
                            "psych", "psych",
                            "history", "history"]})

bar = Bar(x, values='enrolments', label='class', stack='gender',
         title="Number of students enrolled per class",
         legend='top_right',bar_width=1.0)
output_file("myPlot.html")
show(bar)

【讨论】:

  • 谢谢!正是我需要的!
  • bokeh.charts 现在已弃用并删除。你有其他选择吗?
【解决方案3】:

size 为该分组生成一个具有简单行数的列,它生成 y 轴的值。 unstack 生成 matplotlib 创建堆叠条形图所需的行和列信息。

基本上需要

>>> s
one  a   1.0
     b   2.0
two  a   3.0
     b   4.0

并产生:

>>> s.unstack(level=-1)
     a   b
one  1.0  2.0
two  3.0  4.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多