长话短说。如何从 pandas 的类别列中绘制分组箱线图,并仅显示子集中的当前类别而不是所有可能的类别。
[可重现的例子]
我有一个带有因子列的 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')
- 绘制子集(仅绘制子集中的类别,但未按所需顺序按字母顺序排序)
df[df['type']=='X'].boxplot(by='Letter')
- 将因子转换为类别并绘制子集以使集合有序:即使子集中缺少所有类别,也会绘制所有类别。好的部分是它们处于“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')
最佳答案
创建 DataFrame(第一个代码块)后,尝试以下操作:
df['Letter2'] = pd.Categorical(df['Letter'], list('BAC'))
df[df['type']=='X'].boxplot(by='Letter2')
结果:
pd.Categorical
所做的只是简单地将类别列表(第二个参数)和 .boxplot() 中不存在的内容设置为
自然会忽略它,只绘制您要查找的类别。NaN
关于python-3.x - 嘿,我可以在 pandas 中通过箱线图绘制一个组来删除未使用的类别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39380389/