熊猫 .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】:
我赞成这个问题,因为pivot
和groupby
之间存在非常细微的区别。我认为您正在寻找类似的东西:
df.groupby('age').size().plot.bar(width=1)
plt.show()
但是,我认为没有合理的方法可以通过分组获得相同的结果,因为hist()
需要原始形式的观察结果,而groupby
被设计为后跟一个可以转换数据的函数(如count
、min
、mean
等)。
要查看这一点,请注意,通过按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()的主要内容,如果未能解决你的问题,请参考以下文章