python-3.x - 嘿,我可以在 pandas 中通过箱线图绘制一个组来删除未使用的类别吗?

标签 python-3.x pandas matplotlib boxplot

长话短说。如何从 pandas 的类别列中绘制分组箱线图,并仅显示子集中的当前类别而不是所有可能的类别。 enter image description here

[可重现的例子]

我有一个带有因子列的 Pandas 数据框,我想绘制一个箱线图。如果我按因素绘制就可以了。如果我做一个子集并按因子绘制箱线图,也可以,并且只绘制子集中存在的因子。但是,如果我将该列设置为类别,那么所有类别都会绘制在箱线图中,即使它们不存在也是如此。

- 创建数据框

import pandas as pd
import numpy as np
x = ['A']*150 + ['B']*150 + ['C']*150 + ['D']*150 + ['E']*150 + ['F']*150
y = np.random.randn(900)
z = ['X']*450 + ['Y']*450
df = pd.DataFrame({'Letter':x, 'N':y, 'type':z})
print(df.head())
print(df.tail())

- 按因素绘制

df.boxplot(by='Letter')

enter image description here

- 绘制子集(仅绘制子集中的类别,但未按所需顺序按字母顺序排序)

df[df['type']=='X'].boxplot(by='Letter')

enter image description here

- 将因子转换为类别并绘制子集以使集合有序:即使子集中缺少所有类别,也会绘制所有类别。好的部分是它们处于“wanted_sort_order”

df['Letter2'] = df['Letter'].copy()
df['Letter2'] = df['Letter2'].astype('category')
# set a category in order to sort the factor in specific order
df['Letter2'].cat.set_categories(df['Letter2'].drop_duplicates().tolist()[::-1], inplace=True)
df[df['type']=='X'].boxplot(by='Letter2')

enter image description here

最佳答案

创建 DataFrame(第一个代码块)后,尝试以下操作:

df['Letter2'] = pd.Categorical(df['Letter'], list('BAC'))
df[df['type']=='X'].boxplot(by='Letter2')

结果:

enter image description here

pd.Categorical 所做的只是简单地将类别列表(第二个参数)和 .boxplot() 中不存在的内容设置为 NaN 自然会忽略它,只绘制您要查找的类别。

关于python-3.x - 嘿,我可以在 pandas 中通过箱线图绘制一个组来删除未使用的类别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39380389/

相关文章:

python - GNU/Linux-Python3-PySerial : How to send data over USB connection?

python - 在 plt 之外设置 matplotlib 颜色图的限制

python-3.x - 无法从 kdeplot 读取数据

python-3.x - 无法使用 OpenCV2 检测面部标志

python - 如何在 tensorflow 2.0 中使用预制的密集层进行训练?

pandas - 不使用 Lambda 的 Groupby 应用过滤器

python - 如何转换列的值以扩展数据框?

python - 如何混合一种热编码和词袋

python - matplotlib 中的散点图和组合极坐标直方图

python - 了解可变变量的函数作用域