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)
过期输出:
我正在尝试创建一个箱线图,在 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)
过期输出: