【问题标题】:Creating Boxplot using groupby使用 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() 的输出被粘贴到输出窗口并且很长。您希望我将其粘贴到问题框中吗?

标签: pandas matplotlib pandas-groupby seaborn


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 2013-10-27
        相关资源
        最近更新 更多