繁体   English   中英

Boxplot由python pandas中的列分层

[英]Boxplot stratified by column in python pandas

我想为以下pandas数据帧绘制一个boxplot:

> p1.head(10)

   N0_YLDF    MAT
0     1.29  13.67
1     2.32  10.67
2     6.24  11.29
3     5.34  21.29
4     6.35  41.67
5     5.35  91.67
6     9.32  21.52
7     6.32  31.52
8     3.33  13.52
9     4.56  44.52

我想箱形图是'N0_YLDF'列,但它们应该用'MAT'分层。 当我使用foll时。 命令:

p1.boxplot(column='N0_YLDF',by='MAT')

它使用所有唯一的MAT值,在完整的p1数据帧数约为15,000。 这导致难以理解的箱线图。

有没有什么办法可以对MAT值进行分层,这样我就可以得到不同的第二个MAT值的N0_YLDF箱图,依此类推......

谢谢!

Pandas具有cutqcut函数,可以使这样的分层变量变得容易:

# Just asking for split into 4 equal groups (i.e. quartiles) here,
# but you can split on custom quantiles by passing in an array
p1['MAT_quartiles'] = pd.qcut(p1['MAT'], 4, labels=['0-25%', '25-50%', '50-75%', '75-100%'])
p1.boxplot(column='N0_YLDF', by='MAT_quartiles')

输出:

在此输入图像描述

pandas.qcut将为您提供分位数,但类似于直方图的操作将需要一些numpy技巧,这在这里派上用场:

_, breaks = np.histogram(df.MAT, bins=5)
ax = df.boxplot(column='N0_YLDF', by='Class')
ax.xaxis.set_ticklabels(['%s'%val for i, val in enumerate(breaks) if i in df.Class])

在此输入图像描述

数据框现在看起来像这样:

   N0_YLDF    MAT  Class
0     1.29  13.67      1
1     2.32  10.67      0
2     6.24  11.29      1
3     5.34  21.29      1
4     6.35  41.67      2
5     5.35  91.67      5
6     9.32  21.52      1
7     6.32  31.52      2
8     3.33  13.52      1
9     4.56  44.52      3

[10 rows x 3 columns]

它也可以用来获得四分位数:

breaks = np.asarray(np.percentile(df.MAT, [25,50,75,100]))
df['Class'] = (df.MAT.values > breaks[..., np.newaxis]).sum(0)
ax = df.boxplot(column='N0_YLDF', by='Class')
ax.xaxis.set_ticklabels(['%s'%val for val in breaks])

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM