Python:具有多索引的箱线图数据框

Python: boxplot dataframe with multi-index

我正在尝试创建一个箱线图,在 x 轴上我将引用数据框的两列,而在 y 轴上我将显示第 3 列的值。

让我参考一个示例数据框:

  Lvl1  Lvl2  value
0    A     1      1
1    A     2      2
2    A     1      3
3    B     2      4
4    B     1      5
5    B     2      6

现在,我想要对应于 Lvl1 和 Lvl2 的组的箱线图。例如,对于由 (Lvl1 = A, Lvl2 = 1) 表示的组,箱线图将根据 {1,3} 的值进行计算。

我知道我可以创建一个像 Lvl0 这样的新列,它类似于 Lvl1 + Lvl2,但是有没有办法在没有这种操作的情况下创建箱线图?

关于以下代码:

import pandas as pd
import matplotlib.pyplot as plt

dataset = pd.DataFrame(
    {'Lvl1': ['A', 'A', 'A', 'B', 'B', 'B'], 'Lvl2': [1, 2, 1, 2, 1, 2], 'value': [1, 2, 3, 4, 5, 6]})
grouped = dataset.groupby(['Lvl1', 'Lvl2'])
grouped.boxplot()
plt.show()

我收到一个错误:
KeyError:“[Index(['A', 1], dtype='object')] 的 None 在 [index] 中”

提前致谢!

尝试使用 seaborn 以获得更简单的解决方案。我想这里已经回答了:Grouping boxplots in seaborn when input is a DataFrame

你的数据:

import seaborn as sns
import pandas as pd

data = pd.DataFrame({'lvl1': ['A', 'A', 'A', 'B', 'B', 'B'], 
                     'lvl2': [1, 2, 1, 2, 1, 2], 
                     'value': [1, 2, 3, 4, 5, 6]})

df_long = pd.melt(data, "lvl1", var_name="lvl2", value_name="result")

sns.boxplot(x="lvl1", hue="lvl2", y="result", data=df_long)

我们得到:

如果您需要更多关卡,请尝试将地块与 sns.FacetGrid (https://seaborn.pydata.org/generated/seaborn.FacetGrid.html) 相结合。 这里我建议使用 sns.catplot:

data = pd.DataFrame({'lvl1': ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'B'], 
                 'group': ['1', '2', '1', '2', '1', '2', '2', '1'], 
                 'has_something': [True, False, False, True, True, False, True, False], 
                 'before': [3, 4, 5, 5, 3, 4, 2, 6],
                 'after': [1, 2, 3, 4, 5, 6, 2, 3], 
                 'baseline': [1, 0, 0, 1, 1, 0, 0, 1]})

df = pd.melt(data, ["lvl1", 'group', 'has_something'], value_name="result")

sns.catplot(data=df, x='lvl1', y='result',
col='group', kind='box', hue='variable', col_wrap=2, margin_titles=True)

结果在这里:

为了在图中包含 'has_something' 变量,您可以使用 FacetGrid 或通过 'has_something' 分隔数据,并制作两个具有不同过滤数据的图。

你可以通过seaborn来实现。以下代码适用于您的数据:

import pandas as pd
import seaborn as sns

dataset = pd.DataFrame(
    {
        'Lvl1': ['A', 'A', 'A', 'B', 'B', 'B'], 'Lvl2': [1, 2, 1, 2, 1, 2], 
        'value': [1, 2, 3, 4, 5, 6]
    }
)
ax = sns.boxplot(x='Lvl1', y='value', hue="Lvl2", data=dataset)

过期输出: