使用 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 创建箱线图的主要内容,如果未能解决你的问题,请参考以下文章
带有 pandas groupby multiindex 的箱线图,用于来自 multiindex 的指定子级别