Как отсортировать boxplot в панд по медианным значениям?

Я хочу нарисовать boxplot столбца Z в таблице данных df в категории X и Y. Как я могу отсортировать boxplot по медиане, в порядке убывания?

import pandas as pd
import random
n = 100
# this is probably a strange way to generate random data; please feel free to correct it
df = pd.DataFrame({"X": [random.choice(["A","B","C"]) for i in range(n)], 
                   "Y": [random.choice(["a","b","c"]) for i in range(n)],
                   "Z": [random.gauss(0,1) for i in range(n)]})
df.boxplot(column="Z", by=["X", "Y"])

отметим, что этот вопрос очень похоже, но они используют другую структуру данных. Я относительно новичок в pandas (и сделал только некоторые учебники по python в целом), поэтому я не мог понять, как заставить мои данные работать с ответом, размещенным там. Это может быть более о переформировании, чем о заговоре. Возможно, есть решение, использующее groupby?

2 ответов


вы можете использовать ответ в Как сортировать boxplot по медианным значениям в pandas но сначала нужно сгруппировать данные и создать новый фрейм данных:

import pandas as pd
import random
import matplotlib.pyplot as plt

n = 100
# this is probably a strange way to generate random data; please feel free to correct it
df = pd.DataFrame({"X": [random.choice(["A","B","C"]) for i in range(n)], 
                   "Y": [random.choice(["a","b","c"]) for i in range(n)],
                   "Z": [random.gauss(0,1) for i in range(n)]})
grouped = df.groupby(["X", "Y"])

df2 = pd.DataFrame({col:vals['Z'] for col,vals in grouped})

meds = df2.median()
meds.sort(ascending=False)
df2 = df2[meds.index]
df2.boxplot()

plt.show()

plot


подобный ответ xndrme в форме функции для большей портативности

import pandas as pd

def boxplot_sorted(df, by, column):
  df2 = pd.DataFrame({col:vals[column] for col, vals in df.groupby(by)})
  meds = df2.median().sort_values()
  df2[meds.index].boxplot(rot=90)

boxplot_sorted(df, by=["X", "Y"], column="Z")