使用 groupby 创建箱线图

Posted

技术标签:

【中文标题】使用 groupby 创建箱线图【英文标题】:Creating Boxplot using groupby 【发布时间】:2021-07-07 08:41:45 【问题描述】:

我有一个 df,它由两列“日期”和“值”组成,其中包含“值”的多年数据。我想创建一个按月和年分组的值范围的箱线图。我使用 groupby 对值进行分组:

df.groupby(df['date'].dt.strftime('%b%Y'))['value']

但现在我无法弄清楚如何对生成的 groupby 数据结构进行操作以创建箱线图(通过 matplotlib 或 seaborn)。被难住了。

【问题讨论】:

boxplot 已经使用 by 关键字对数据进行了分组。如需进一步帮助,您能否提供示例数据作为可重现的代码? 我该怎么做?数据由一系列浮点数组成,超过 4 个日历年。 您可以使用df.to_dict() 执行此操作,然后我们可以将其复制并粘贴到我们的控制台中。 抱歉,没有你那么老练。我正在使用 Juypter 笔记本,df.to_dict() 的输出被粘贴到输出窗口并且很长。您希望我将其粘贴到问题框中吗? 【参考方案1】:

假设您的数据框看起来像是由以下代码生成的:

import pandas as pd
import numpy as np
df = pd.DataFrame('date': pd.date_range('2019-1-1', periods=1000, freq='D'), 
                   'value': np.random.randint(0,10,size=1000))

看起来像这样:

          date  value
0   2019-01-01      3
1   2019-01-02      9
2   2019-01-03      2
3   2019-01-04      2
4   2019-01-05      4
..         ...    ...
995 2021-09-22      3
996 2021-09-23      5
997 2021-09-24      1
998 2021-09-25      4
999 2021-09-26      8

现在你可以计算一个新列month

df['month'] = df.date.dt.month
          date  value  month
0   2019-01-01      3      1
1   2019-01-02      9      1
2   2019-01-03      2      1
3   2019-01-04      2      1
4   2019-01-05      4      1
..         ...    ...    ...
995 2021-09-22      3      9
996 2021-09-23      5      9
997 2021-09-24      1      9
998 2021-09-25      4      9
999 2021-09-26      8      9

并使用这个新列作为 grouper 调用 boxplot

df.boxplot('value', by='month')

【讨论】:

【参考方案2】:

parse_dates 您的时间序列日期列并将其设置为索引。使用 pd.Grouper 和级别 0 访问索引并将频率设置为 D 或每天。箱线图将根据 grouped.index.year 找到最小和最大频率以及中值和异常值

df=pd.read_csv('sp500.csv',parse_dates=['Date'],index_col='Date')
grouped=df.groupby(pd.Grouper(level=0,freq='D'))['Open'].mean()

sns.boxplot(x=grouped.index.year, y=grouped.values,
data=grouped)
plt.xticks(rotation=90)
plt.show()

【讨论】:

【参考方案3】:

您可以使用日期时间访问器 to_period() 按月进行分组。

import pandas as pd
import numpy as np
df = pd.DataFrame('date': pd.date_range('2019-1-1', periods=1000, freq='D'), 
                   'value': np.random.randint(0,10,size=1000))

df.groupby(df.date.dt.to_period("M")).boxplot(subplots=False, rot=90)

【讨论】:

以上是关于使用 groupby 创建箱线图的主要内容,如果未能解决你的问题,请参考以下文章

为 groupby 对象绘制箱线图

带有 pandas groupby multiindex 的箱线图,用于来自 multiindex 的指定子级别

带有 pandas、groupby、子图、计算/描述性统计、聚合的箱线图

向熊猫数据框箱线图添加标签?

使用多个数据框的第一行的第一个元素创建箱线图

R语言 箱线图