【问题标题】:Stacked histogram of grouped values in PandasPandas 中分组值的堆叠直方图
【发布时间】:2017-05-28 02:01:23
【问题描述】:

我正在尝试使用此代码创建分组值的堆叠直方图:

titanic.groupby('Survived').Age.hist(stacked=True)

但我得到的直方图没有堆积条形。

如何在不必直接使用 matplotlib 或迭代组的情况下堆叠直方图的条形?

使用的数据集:https://www.udacity.com/api/nodes/5454512672/supplemental_media/titanic-datacsv/download

【问题讨论】:

    标签: python pandas histogram


    【解决方案1】:

    改进答案,最好的方法可能是:

    titanic.pivot(columns='Survived').Age.plot(kind = 'hist', stacked=True)
    

    【讨论】:

      【解决方案2】:

      到目前为止,我发现的最好方法是使用组创建一个新的数据框:

      pd.DataFrame({'Non-Survivors': titanic.groupby('Survived').get_group(0).Age,
                    'Survivors':   titanic.groupby('Survived').get_group(1).Age})
                  .plot.hist(stacked=True)
      

      【讨论】:

      • 当按具有更多值的列分组时,这可能更容易:pd.DataFrame({k: v for k, v in titanic.groupby('Survived').Age}).plot.hist(stacked=True)
      • 这里对我来说是最好的解决方案,尤其是df.pivot 是一个非常具体的操作,仅适用于分类系列。
      【解决方案3】:

      我定义了一个利用np.histogram的自定义函数
      另请注意,直方图组是在 'Survived' 组内计算的

      def hist(x):
          h, e = np.histogram(x.dropna(), range=(0, 80))
          e = e.astype(int)
          return pd.Series(h, zip(e[:-1], e[1:]))
      
      kw = dict(stacked=True, width=1, rot=45)
      titanic.groupby('Survived').Age.apply(hist).unstack(0).plot.bar(**kw)
      

      【讨论】:

        【解决方案4】:

        此解决方案使用条形图而不是直方图,但我认为它可以为您提供所需的内容。

        titanic.groupby(['Survived', pd.cut(titanic['Age'], np.arange(0,100,10))])\
               .size()\
               .unstack(0)\
               .plot.bar(stacked=True)
        

        【讨论】: