如何按熊猫中的中值对箱线图进行排序

Posted

技术标签:

【中文标题】如何按熊猫中的中值对箱线图进行排序【英文标题】:How to sort a boxplot by the median values in pandas 【发布时间】:2013-10-28 11:20:05 【问题描述】:

我有一个数据框outcome2,我用以下方式生成了一个分组箱线图:

In [11]: outcome2.boxplot(column='Hospital 30-Day Death (Mortality) Rates from Heart Attack',by='State')
        plt.ylabel('30 Day Death Rate')
        plt.title('30 Day Death Rate by State')
Out [11]:

我想做的是按每个州的中位数对图进行排序,而不是按字母顺序。不知道该怎么做。

【问题讨论】:

“按字母顺序排列”是什么意思?您是否只想查看每个州名的第一个字母?您可以按中位数或字母顺序排序,但不能同时进行。 @PhillipCloud 错字,抱歉。默认情况下应该阅读“而不是按字母顺序”。 【参考方案1】:

要按中位数排序,只需计算中位数,然后对其进行排序并使用生成的IndexDataFrame 进行切片:

In [45]: df.iloc[:10, :5]
Out[45]:
      AK     AL     AR     AZ     CA
0  0.047  0.199  0.969 -0.205  1.053
1  0.206  0.132 -0.712  0.111 -0.254
2  0.638  0.233 -0.907  1.284  1.193
3  1.234  0.046  0.624  0.485 -0.048
4 -1.362 -0.559  1.108 -0.501  0.111
5  1.276 -0.954  0.653 -0.175 -0.287
6  0.524 -1.785 -0.887  1.354 -0.431
7  0.111  0.762 -0.514  0.808  0.728
8  1.301  0.619  0.957  1.542 -0.087
9 -0.892  2.327  1.363 -1.537  0.142

In [46]: med = df.median()

In [47]: med.sort()

In [48]: newdf = df[med.index]

In [49]: newdf.iloc[:10, :5]
Out[49]:
      PA     CT     LA     RI     MO
0 -0.667  0.774 -0.999 -0.938  0.155
1  0.822  0.390 -0.014 -2.228  0.570
2 -1.037  0.838 -0.673  2.038  0.809
3  0.620  2.845 -0.523 -0.151 -0.955
4 -0.918  1.043  0.613  0.698 -0.446
5 -0.767  0.869 -0.496 -0.925 -0.374
6 -0.495  0.437  1.245 -1.046  0.894
7 -1.283  0.358  0.016  0.137  0.511
8 -0.018 -0.047 -0.639 -0.385  0.080
9 -1.705  0.986  0.605  0.295  0.302

In [50]: med.head()
Out[50]:
PA   -0.117
CT   -0.077
LA   -0.072
RI   -0.069
MO   -0.053
dtype: float64

结果图:

【讨论】:

这是一个很好的解决方案,但是如果您的数据框中缺少任何数据,它会引发 KeyError。我希望找到解决该问题的方法。

以上是关于如何按熊猫中的中值对箱线图进行排序的主要内容,如果未能解决你的问题,请参考以下文章

根据中值对箱线图进行排序

使用 Plotly Graph 对象按中值对箱线图进行排序

当输入是 DataFrame 时在 seaborn 中对箱线图进行分组

使用 ggplotly 对箱线图进行分组时不考虑分组

为熊猫箱线图(groupby)设置无标题

有箱线图,想用值标记中值和胡须