熊猫 .plot.hist() 和 .groupby()

Posted

技术标签:

【中文标题】熊猫 .plot.hist() 和 .groupby()【英文标题】:pandas .plot.hist() with .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) ) 【参考方案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 边界:

【讨论】:

以上是关于熊猫 .plot.hist() 和 .groupby()的主要内容,如果未能解决你的问题,请参考以下文章

数据特征分析

R语言笔记 画多个图

迭代 Pandas 分组数据框

ldap嵌套组成员资格

linq 连接中是不是存在“不等于”

s-s-rS 报告语法