【问题标题】:How to bar plot grouped by two variables如何按两个变量分组条形图
【发布时间】:2021-10-16 10:27:20
【问题描述】:

我有若干年的 15 分钟时间步长数据...

Datetime Quantity
01/07/2018 00:15 6.96
01/07/2018 00:30 6.48
01/07/2018 00:45 6.96
01/07/2018 01:00 6.72
. .
. .

我正在使用熊猫。如何生成横轴为月份的条形图;以及每年的一系列(一组条形图);每个条的高度是该月和该年的总量。

就是这样:

【问题讨论】:

    标签: python pandas dataframe datetime matplotlib


    【解决方案1】:

    虚假数据框创建:

    df = pd.DataFrame()
    df['Datetime'] = pd.date_range(start = '01/07/2018', end = '13/08/2021', freq = '15min')
    df['Quantity'] = np.random.rand(len(df))
    

    从这一点开始,您应该提取月份和年份并将它们保存在单独的列中:

    df['month'] = df['Datetime'].dt.month
    df['year'] = df['Datetime'].dt.year
    

    然后你必须按月计算每年'Quantity' 的总和:

    df = df.groupby(by = ['month', 'year'])['Quantity'].sum().reset_index()
    

    在这段话之后,你应该有一个这样的数据框:

                 Datetime  Quantity  month  year
    0 2018-01-07 00:00:00  0.226113      1  2018
    1 2018-01-07 00:15:00  0.222872      1  2018
    2 2018-01-07 00:30:00  0.835484      1  2018
    3 2018-01-07 00:45:00  0.775771      1  2018
    4 2018-01-07 01:00:00  0.972559      1  2018
    5 2018-01-07 01:15:00  0.418036      1  2018
    6 2018-01-07 01:30:00  0.902843      1  2018
    7 2018-01-07 01:45:00  0.012441      1  2018
    8 2018-01-07 02:00:00  0.883437      1  2018
    9 2018-01-07 02:15:00  0.183561      1  2018
    

    现在可以绘制数据框了;使用 seaborn:

    fig, ax = plt.subplots()
    
    sns.barplot(ax = ax, data = df, x = 'month', y = 'Quantity', hue = 'year')
    
    plt.show()
    

    完整代码

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    
    df = pd.DataFrame()
    df['Datetime'] = pd.date_range(start = '01/07/2018', end = '13/08/2021', freq = '15min')
    df['Quantity'] = np.random.rand(len(df))
    df['month'] = df['Datetime'].dt.month
    df['year'] = df['Datetime'].dt.year
    
    df = df.groupby(by = ['month', 'year'])['Quantity'].sum().reset_index()
    
    
    fig, ax = plt.subplots()
    
    sns.barplot(ax = ax, data = df, x = 'month', y = 'Quantity', hue = 'year')
    
    plt.show()
    

    【讨论】:

      【解决方案2】:

      也许您可以将月份和年份提取到新列中,并制作多个以月份为 x 轴的子图,每年一个,最后将它们全部组合成一个独特的图。看下面的例子,注意plt.bar中的width参数和位移相同的值,这样图就不会互相覆盖了。

      import pandas as pd
      import matplotlib.pyplot as plt
      import datetime
      
      # create df
      d1 = datetime.date(2018, 8, 30)
      d2 = datetime.date(2018, 9, 30)
      d3 = datetime.date(2019, 8, 30)
      d4 = datetime.date(2019, 9, 30)
      
      df = pd.DataFrame({
          'date': [d1, d1, d2, d2, d3, d3, d4, d4],
          'values':[10, 20, 40, 40, 50, 55, 65, 70]})
      
      df['month'] = df.date.apply(lambda x: x.month)
      df['year'] = df.date.apply(lambda x: x.year)
      
      # make plots
      fig, ax = plt.subplots()
      ax = plt.bar(df[df.year == 2018].groupby(['month']).sum()['values'].index, df[df.year == 2018].groupby(['month']).sum()['values'])
      ax = plt.bar(df[df.year == 2019].groupby(['month']).sum()['values'].index, df[df.year == 2019].groupby(['month']).sum()['values'])
      plt.show()
      

      如果您有一个非常大的数据框,也许像我一样创建新列对您来说效率不高。为了制作这些图,我在每一行中按年份过滤行,按月份对它们进行分组并使用值的总和。索引是元组(year, month)

      【讨论】:

        猜你喜欢
        • 2022-08-02
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        相关资源
        最近更新 更多