使用 groupby 创建箱线图

时间:2021-04-12 08:56:39

标签: pandas matplotlib pandas-groupby seaborn

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

并使用此新列作为石斑鱼调用 boxplot

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

答案 1 :(得分:0)

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()

答案 2 :(得分:0)

您可以按月使用日期时间访问器 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)

enter image description here