与熊猫groupby的Boxplot

时间:2013-08-28 21:39:16

标签: python group-by pandas dataframe

好的,我有一个数据框,其中包含每列有多行索引的时间序列数据。以下是数据外观的示例,它采用csv格式。加载数据不是问题。

enter image description here

我想要做的是能够根据multiinex特定行中的不同类别创建一个包含此数据的箱线图。例如,如果我按'SPECIES'进行分组,我会在时间序列的特定时间为每个组提供组,'aq','gr','mix','sed'和一个方框。

我试过这个:

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

但是它为组中的每个点而不是分组集提供了一个箱线图(扁平线)。是否有捷径可寻?我没有任何分组问题,因为我可以按照我想要的方式聚合组,但我不确定我在这个方框图上做错了什么。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:33)

此代码:

int limit = ( 100 / 3 ) + 1;
IntStream.iterate(0, n -> n + 3).limit(limit).forEach(System.out::println);

无效,因为boxplot是DataFrame的函数而不是Series。

在Pandas中> 0.18.1 boxplot函数具有参数data['2013-08-17'].boxplot(by='SPECIES') ,该参数定义了从哪个列获取数据。

所以

columns

应该返回所需的结果。

Iris数据集的示例:

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

创建:

Boxplot iris dataset with pandas

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)

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

plt.suptitle('') 

也有效。

答案 1 :(得分:14)

我想我想通了,也许这会对某人有所帮助:

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

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

enter image description here

答案 2 :(得分:0)

这应该适用于版本0.16:

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