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)
这就是我得到的:
但是,我原本期望获得的是两个箱图,每个箱图仅描述第一列,按第二列中的相应列(转换为系列的列)分组,而上图则分别显示每列不是什么我想要.
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)
并且您希望列的箱图a
和b
按列分组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
.特别是旋转后层次的扁平化难以阅读,我不喜欢它.