多索引中指定子级的pandas groupby multiindex箱线图

2024-04-19 08:59:39 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我有一个包含timeseries数据的dataframe,每个列都有一个多行索引。这是一个什么样的数据,它是在csv格式的样本。在这里加载数据不是问题。

enter image description here

我想做的是能够用这些数据按照多索引的特定行中的不同类别分组来创建一个boxplot。例如,如果我按“种类”分组,我将在时间序列中的特定时间为每个组设置“aq”、“gr”、“mix”、“sed”和一个框。

我试过这个:

grouped = data['2013-08-17'].groupby(axis=1, level='SPECIES')
grouped.boxplot()

但是它为组中的每个点而不是分组集提供了一个boxplot(平面线)。有什么简单的方法可以做到这一点吗?我对分组没有任何问题,因为我可以按任何方式对分组进行聚合,但无法将它们放到boxplot中。


Tags: csv数据dataframe格式时间序列类别样本
3条回答

我想我明白了,也许这对某人有帮助:

grouped = data['2013-08-17'].groupby(axis=1, level='SPECIES').T
grouped.boxplot()

基本上groupby输出需要进行转置,以便boxplot显示正确的分组:

enter image description here

这在0.16版中应该有效:

data['2013-08-17'].boxplot(by='SPECIES')

此代码:

data['2013-08-17'].boxplot(by='SPECIES')

不会工作,因为boxplot是数据帧而不是序列的函数。

而在Pandas>;0.18.1中,boxplot函数有一个参数columns,该参数定义从哪个列获取数据。

所以

data.boxplot(column='2013-08-17',by='SPECIES')

应返回所需的结果。

Iris数据集示例:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv')
fig, ax = plt.subplots(figsize=(10,8))
plt.suptitle('')
data.boxplot(column=['SepalLength'], by='Name', ax=ax)

创建:

Boxplot iris dataset with pandas

plt.suptitle('') 

关闭恼人的自动字幕。当然还有 列参数接受列列表。。。所以

data.boxplot(column=['SepalLength', 'SepalWidth'], by='Name', ax=ax)

同样有效。

相关问题 更多 >