Pandas的crosstab函数( 二 )
尽管它有点高级 , 但是当你将crosstab()表传递到seaborn的热图中时 , 你将充分利用crosstab()表的优点 。 让我们在热图中看到上表:
cross = pd.crosstab(index=diamonds['cut'],columns=diamonds['color'],values=diamonds['price'],aggfunc=np.mean).round(0)sns.heatmap(cross, cmap='rocket_r', annot=True, fmt='g');
文章插图
seaborn可以自动将crosstab()表转换为热图 。 我将注释设置为True , 并用颜色条显示热图 。 seaborn还为列和索引名添加了样式(fmt='g' 将数字显示为整数而不是科学计数) 。
热图更容易解释 。 你不想让你的最终用户看到一张满是数字的表格 。 因此 , 我将在需要时将每个crosstab()结果放入热图中 。 为了避免重复 , 我创建了一个有用的函数:
def plot_heatmap(cross_table, fmt='g'):fig, ax = plt.subplots(figsize=(8, 5))sns.heatmap(cross_table,annot=True,fmt=fmt,cmap='rocket_r',linewidths=.5,ax=ax)plt.show();Pandas crosstab()与pivot_table()和groupby()的比较在我们继续讨论更有趣的内容之前 , 我想我需要澄清计算分组摘要统计的三个函数之间的区别 。
我在本文的第一部分介绍了pivot_table()和groupby()的区别 。 对于crosstab() , 这三者之间的区别在于语法和结果的形状 。 让我们使用这三种方法计算:
# 使用 groupby()>>> diamonds.groupby(['cut', 'color'])['price'].mean().round(0)cutcolorIdealD2629.0E2598.0F3375.0G3721.0H3889.0I4452.0J4918.0PremiumD3631.0E3539.0F4325.0G4501.0H5217.0I5946.0J6295.0Very GoodD3470.0E3215.0F3779.0G3873.0H4535.0I5256.0J5104.0GoodD3405.0E3424.0F3496.0G4123.0H4276.0I5079.0J4574.0FairD4291.0E3682.0F3827.0G4239.0H5136.0I4685.0J4976.0Name: price, dtype: float64# 使用 pivot_table()diamonds.pivot_table(values='price',index='cut',columns='color',aggfunc=np.mean).round(0)# 使用 crosstab()pd.crosstab(index=diamonds['cut'],columns=diamonds['color'],values=diamonds['price'],aggfunc=np.mean).round(0)
文章插图
以上是pivot_table的输出
文章插图
以上是crosstab的输出
我想你已经知道你最喜欢的了 。 grouppy()返回一个序列 , 而另两个返回相同的数据帧 。 但是 , 可以将groupby系列转换为相同的数据帧 , 如下所示:
grouped = diamonds.groupby(['cut', 'color'])['price'].mean().round(0)grouped.unstack()
文章插图
如果你不了解pivot_table()和unstack()的语法 , 我强烈建议你阅读本文的第一部分 。
说到速度 , crosstab()比pivot_table()快 , 但都比groupby()慢得多:
%%timeitdiamonds.pivot_table(values='price',index='cut',columns='color',aggfunc=np.mean)11.5 ms ± 483 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)%%timeitpd.crosstab(index=diamonds['cut'],columns=diamonds['color'],values=diamonds['price'],aggfunc=np.mean)10.8 ms ± 344 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)%%timeitdiamonds.groupby(['cut', 'color'])['price'].mean().unstack()4.13 ms ± 39.8 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
推荐阅读
- 不常见的Pandas小窍门:我打赌一定有你不知道的
- countif函数的四种另类经典用法,我不说没人告诉你
- Pandas的SettingWithCopyWarning
- 让人头痛的Generator 函数的异步应用真的有用吗?
- PowerQuery 表达式计算函中调用其他函数的方法
- Python中文速查表-Pandas 基础
- Pandas教程
- 函数逸闻之大小写
- Java函数式编码结构-好程序员
- Python数据处理,pandas 统计连续停车时长
