如何将自定义列顺序(分类)应用于pandas箱线图?

2024-06-02 02:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:这个问题出现在pandas~0.13中,在0.15-0.18版本之间的某个地方被直接支持淘汰(根据@Cireo's late answer


我可以在pandas数据框中获得工资列的boxplot。。。

train.boxplot(column='Salary', by='Category', sym='')

…但是我无法确定如何定义列“Category”上使用的索引顺序-我想根据另一个条件提供自己的自定义顺序:

category_order_by_mean_salary = train.groupby('Category')['Salary'].mean().order().keys()

如何将自定义列顺序应用于boxplot列?(除了使用前缀对列名进行丑陋的模糊处理以强制排序之外)

“Category”是一个字符串(实际上,应该是一个categorical,但这可以追溯到0.13,其中categorical是一个三级公民)列,包含27个不同的值:['Accounting & Finance Jobs','Admin Jobs',...,'Travel Jobs']。所以它可以很容易地用pd.Categorical.from_array()分解

检查时,限制在pandas.tools.plotting.py:boxplot()内,它转换列对象而不允许排序:

我想我可以破解定制版本的pandas boxplot(),或者深入到对象的内部。并提交增强请求。


Tags: py版本pandasby排序顺序jobsorder
3条回答

如果没有一个有效的例子,很难说如何做到这一点。我的第一个猜测是添加一个整数列和您想要的顺序。

一个简单的,暴力的方法是每次添加一个方框图。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(37,4), columns=list('ABCD'))
columns_my_order = ['C', 'A', 'D', 'B']
fig, ax = plt.subplots()
for position, column in enumerate(columns_my_order):
    ax.boxplot(df[column], positions=[position])

ax.set_xticks(range(position+1))
ax.set_xticklabels(columns_my_order)
ax.set_xlim(xmin=-0.5)
plt.show()

enter image description here

请注意,pandas现在可以创建分类列。如果您不介意让所有列都显示在图形中,或者适当地对它们进行修剪,可以执行以下操作:

http://pandas.pydata.org/pandas-docs/stable/categorical.html

df['Category'] = df['Category'].astype('category', ordered=True)

最近的熊猫似乎也允许positions从帧到轴的整个过程。

实际上我也被同一个问题困住了。我做了一个地图,重置了xticklabels,代码如下:

df = pd.DataFrame({"A":["d","c","d","c",'d','c','a','c','a','c','a','c']})
df['val']=(np.random.rand(12))
df['B']=df['A'].replace({'d':'0','c':'1','a':'2'})
ax=df.boxplot(column='val',by='B')
ax.set_xticklabels(list('dca'))

相关问题 更多 >