绘制包含数组的 pandas 数据框时出现问题

问题描述 投票:0回答:1

我有一个棘手的问题要问你,关于 pandas 中用于使用 seaborn 进行绘图的数据结构。

让我们想象一下,我有几个实验,每个实验都在不同的条件下进行。每个实验的结果都是一个有几千个浮点数的数组。

我正在考虑将所有实验结果存储在单个 pandas 数据框中,即所谓的长格式,即每一行都是一个实验,每一列都是一个变量。 几乎所有变量都用于定义实验条件,然后一个变量包含带有实验结果的浮点数组。

类似这样的:

df = pd.DataFrame({'id':[1,2], 'temp':[21,22], 'oven':[0,1], 'values':[[1,2,3,4,5], [10,11,12,12,15,16,17]]})

到目前为止一切顺利。

现在我想用seaborn来做一些绘图。想象一下,我想使用 id 作为类别来绘制值的直方图。

我会做:

sns.histplot(df, x='values', hue='id')

但是如果我这样做,我会收到一条错误消息,抱怨列表是不可散列的类型。

作为解决方法,我更改了数据结构,以便实验结果中的每个浮点数都有一行,但这使表变得不必要的巨大。

你对我有什么建议吗?

python pandas dataframe seaborn
1个回答
1
投票

平坦/整洁的 DataFrame 几乎是相同的,但每个点一行。

如果你

explode
你的数据集,这会起作用:

df_flat = df.explode('values')

sns.histplot(df_flat, x='values', hue='id')

输出:

enter image description here

另一种选择是建立一本字典:

sns.histplot(dict(zip(df['id'], df['values'])))

# or
sns.histplot({k: v.squeeze() for k,v in df.groupby('id')['values']})

输出:

enter image description here

最后,您始终可以手动绘图:

ax = plt.subplot()

for row in df.index:
    ax.hist(df.loc[row, 'values'], label=df.loc[row, 'id'])
ax.legend()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.