Pandas 为什么DataFrameGroupBy.boxplot方法在给定参数“0”时抛出错误;子批次=真/假”吗;?

Pandas 为什么DataFrameGroupBy.boxplot方法在给定参数“0”时抛出错误;子批次=真/假”吗;?,pandas,matplotlib,dataframe,boxplot,Pandas,Matplotlib,Dataframe,Boxplot,我可以使用DataFrameGroupBy.boxplot(…)以以下方式创建boxplot: In [15]: df = pd.DataFrame({"gene_length":[100,100,100,200,200,200,300,300,300], ...: "gene_id":[1,1,1,2,2,2,3,3,3], ...: "density":[0.4,1.1,1.2,1.9,2.0,2.5

我可以使用DataFrameGroupBy.boxplot(…)以以下方式创建boxplot:

In [15]: df = pd.DataFrame({"gene_length":[100,100,100,200,200,200,300,300,300],
...:                        "gene_id":[1,1,1,2,2,2,3,3,3],
...:                        "density":[0.4,1.1,1.2,1.9,2.0,2.5,2.2,3.0,3.3],
...:                        "cohort":["USA","EUR","FIJ","USA","EUR","FIJ","USA","EUR","FIJ"]})
[17]中的
:df.groupby(“队列”).boxplot(column=“density”,by=“gene\u id”)

[18]中的
:plt.show()

这将生成以下图像:

这正是我想要的,除了不制作三个子图之外,我希望所有的图都在一个图中(美国、欧洲和FIJ的颜色不同)。我试过了

[17]中的
:df.groupby(“队列”).boxplot(column=“density”,subplot=False,by=“gene\u id”)

但它会产生错误

KeyError:'gene\u id'


我认为问题与以下事实有关:
by=“gene\u id”
是发送到matplotlib boxplot方法的关键字。如果有人有更好的方法来生成我想要的图,也许可以使用DataFrame.boxplot(?),请在这里回复。非常感谢

要使用纯
pandas
函数,我认为在调用
boxplot
之前不应该
GroupBy
,而是在调用
DataFrame
本身的
boxplot
时,请求按特定列分组:

df.boxplot(column='density',by=['gene_id','cohort'])

<> >为了获得更好的结果,您可能需要考虑使用库。它旨在帮助您精确完成这类任务:

sns.boxplot(data=df,x='gene_id',y='density',hue='cohort')

编辑以考虑以下评论 如果你想让你的每一组箱线图对每一个基因进行堆叠/叠加,那就有点复杂了(加上你可能会得到一个相当丑陋的输出)。您不能使用Seaborn、AFAIK实现这一点,但可以直接使用pandas,方法是将
position=
参数用于boxplot()。捕捉它以生成正确的位置序列,从而将箱线图放置在需要的位置,但您必须自己修复记号标签和图例

pos = [i for i in range(len(df.gene_id.unique())) for _ in range(len(df.cohort.unique()))]
df.boxplot(column='density',by=['gene_id','cohort'],positions=pos)

另一种方法是使用
seaborn.swarmlot
而不是使用箱线图。Swarmlot绘制每个点,而不是盒状图的合成表示,但是您可以使用参数
split=False
来获得按队列着色的点,但对于每个基因id,这些点彼此重叠

sns.swarmplot(data=df,x='gene_id',y='density',hue='cohort', split=False)


如果不知道数据帧的实际内容(每个基因和每个队列的点数,以及它们在每个队列中的分离程度),很难说哪种解决方案最合适。

感谢您的回答。这是我制作的玩具数据集的一个很好的解决方案,尤其是Seaborn库。不幸的是,因为我的数据集有90个基因ID,所以我没有足够的空间将群体并排分组。相反,它们需要相互垂直堆叠。也许Seaborn允许这样做?@ecneicS我已经完成了我的答案,检查一下。非常感谢。很高兴我能帮忙。如果你认为你的问题被回答了,请考虑通过点击旁边的复选标记来接受答案,以便向其他人指出主题是关闭的。