Seaborn groupby pandas系列

Arm*_*man 4 matplotlib pandas seaborn

我想将我的数据可视化为箱形图,这些框图按照我的可怕图纸中显示的另一个变量进行分组:

在此输入图像描述

所以我所做的就是使用pandas系列变量来告诉大熊猫我已经对变量进行了分组,这就是我所做的:

import pandas as pd
import seaborn as sns
#example data for reproduciblity
a = pd.DataFrame(
[
[2, 1],
[4, 2],
[5, 1],
[10, 2],
[9, 2],
[3, 1]
])

#converting second column to Series 
a.ix[:,1] = pd.Series(a.ix[:,1])
#Plotting by seaborn
sns.boxplot(a, groupby=a.ix[:,1])
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

seaborn情节

但是,我原本期望获得的是两个箱图,每个箱图仅描述第一列,按第二列中的相应列(转换为系列的列)分组,而上图则分别显示每列不是什么我想要.

Rut*_*ies 7

a中的列Dataframe已经是a Series,因此您无需进行转换.此外,如果您只想对两个箱图使用第一列,则只应将其传递给Seaborn.

所以:

#example data for reproduciblity
df = pd.DataFrame(
[
[2, 1],
[4, 2],
[5, 1],
[10, 2],
[9, 2],
[3, 1]
], columns=['a', 'b'])

#Plotting by seaborn
sns.boxplot(df.a, groupby=df.b)
Run Code Online (Sandbox Code Playgroud)

我稍微改变了你的例子,在列表中给标签添加标签让我更清楚一些.

在此输入图像描述

编辑:

如果你想分别绘制所有列,你(我认为)基本上想要你的groupby列和任何其他列中的值的所有组合.所以如果你Dataframe看起来像这样:

    a   b  grouper
0   2   5        1
1   4   9        2
2   5   3        1
3  10   6        2
4   9   7        2
5   3  11        1
Run Code Online (Sandbox Code Playgroud)

并且您希望列的箱图ab按列分组grouper.你应该扁平化的列,并更改GROUPBY列包含类似的值a1,a2,b1等.

考虑到上面显示的Dataframe,我认为这应该是一种粗糙的方式:

dfpiv = df.pivot(index=df.index, columns='grouper')

cols_flat = [dfpiv.columns.levels[0][i] + str(dfpiv.columns.levels[1][j]) for i, j in zip(dfpiv.columns.labels[0], dfpiv.columns.labels[1])]  
dfpiv.columns = cols_flat
dfpiv = dfpiv.stack(0)

sns.boxplot(dfpiv, groupby=dfpiv.index.get_level_values(1))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

也许还有更多花哨的重组方式Dataframe.特别是旋转后层次的扁平化难以阅读,我不喜欢它.