【问题标题】:pandas .plot.hist() with .groupby()熊猫 .plot.hist() 和 .groupby()
【发布时间】:2021-06-16 11:09:42
【问题描述】:

我知道有人问过this similar question;但是,如果可能的话,我正在寻求进一步的说明,以便更好地理解 .groupby 。 Data used

我想要这样的完全相同的结果,但使用 .groupby():

df.pivot(columns='survived').age.plot.hist()

所以我试试:

df.groupby('age')['survived'].count().plot.hist()

x 轴看起来不正确。有什么方法可以得到与 .pivot() 使用纯 .groupby() 方法相同的结果?谢谢。

【问题讨论】:

  • 有点等价于(df['survived'].groupby(pd.cut(df.age, bins=10)) .value_counts() .unstack().plot.bar(width=0.4) )

标签: pandas pandas-groupby pivot-table histogram


【解决方案1】:

我赞成这个问题,因为pivotgroupby 之间存在非常细微的区别。我认为您正在寻找类似的东西:

df.groupby('age').size().plot.bar(width=1)
plt.show()

但是,我认为没有合理的方法可以通过分组获得相同的结果,因为hist() 需要原始形式的观察结果,而groupby 被设计为后跟一个可以转换数据的函数(如countminmean等)。

要查看这一点,请注意,通过按age 分组,然后使用count,您不再拥有原始年龄数组。例如,对 40 岁的人进行了 13 次观察。原始数据看起来像(40, 40, ... , 40, 40),而分组计数看起来像:

age  count
 40     13

这不是直方图数据的样子。另一个关键区别是直方图中的 bin。如您所见,第一个图计算了年龄在 0 到 10 岁之间的人的所有观察结果。通过按年龄分组,您将在此箱内有 11 个箱:一个用于 0 岁的人,一个用于 1 岁的人,一个用于人2岁等

总而言之,groupby 需要一个函数来转换原始数据,但为了绘制直方图,您需要原始状态的数据。出于这个原因,pivot 是此类任务的首选解决方案,因为它还按survived 拆分数据,但不对数据应用任何函数。

【讨论】:

    【解决方案2】:

    扩展 Quang 的评论,您可能希望对年龄进行分类,而不是对每个年龄进行分组(df.groupby('age') 就是这样做的)。

    一种方法是cut age 垃圾箱:

    df['age group'] = pd.cut(df.age, bins=range(0, 100, 10), right=False)
    

    然后groupby 那些箱并制作survived.value_counts() 的条形图:

    (df.groupby('age group').survived.value_counts()
       .unstack().plot.bar(width=1, stacked=True))
    

    我注意到在您发布的链接中,所有直方图看起来都有些不同。我认为这是由于每种方法的分箱方式略有不同。切割自己的 bin 的一个优点是您可以清楚地看到确切的 bin 边界:

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 2013-06-06
      • 2019-01-18
      • 2020-09-08
      • 2019-02-24
      • 1970-01-01
      • 2018-12-09
      • 2018-07-30
      • 2017-05-22
      相关资源
      最近更新 更多