【问题标题】:How can I make a group by (month + year) converting into a Pandas dataframe?如何按(月+年)转换为 Pandas 数据框进行分组?
【发布时间】:2021-05-12 08:25:56
【问题描述】:

我正在尝试从 pandas 数据框中获取平均值并将其转换为新的数据框,其中包含按月 + 年分组的列的平均值。所以我找到了这个答案:pandas dataframe groupby datetime month,但它并没有完全解决问题。

这就是我所拥有的:

dt            grade
2020-01-01    10
2020-01-02    20
2020-02-01    30
2020-02-01    40
2020-03-01    10
2020-03-04    20

这就是我想要的:

dt           grade_mean
2020-01      15
2020-02      35
2020-03      15

我还希望能够按天或按周分组,并获得一个数据框作为输出。所以这就是我到目前为止所做的:

df = pd.to_datetime(df['dt'], format="%m/%d/%y %I:%M%p")

df_grouped = df.groupby(by=[df.index.month, df.index.year])

df_grouped.grade.mean()

快完成了,但还是无法获取数据帧。

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    首先将您的日期转换为日期时间类型:

    # this code is wrong, you overwrite `df`
    # df = pd.to_datetime(df['dt'], format="%m/%d/%y %I:%M%p")
    # use
    df['dt'] = pd.to_datetime(df['dt'])
    
    # and groupby with two keys can be a lot slower than with just one
    # df_grouped = df.groupby(by=[df.index.month, df.index.year])
    

    尝试使用to_period

    out = df.groupby(pd.to_datetime(df['dt']).dt.to_period('M')).mean()
    

    另外,pd.Grouper 在接受的答案中会很好:

    # also `W` for week and `D` for day
    out = df.groupby(pd.Grouper(freq='M', key='dt')).mean()
    

    【讨论】:

      【解决方案2】:

      一种方法,当您评估一个字符串而不是一个整数时可能会非常昂贵

      是在你的日期时间对象上使用dt.strftime

      # assuming `dt` is already a a datetime object.
      # df['dt'] = pd.to_datetime(df['dt'],format='%Y-%m-%d')
      df.groupby([df['dt'].dt.strftime('%Y-%m')])['grade'].mean().reset_index()
      
              dt  grade
      0  2020-01     15
      1  2020-02     35
      2  2020-03     15
      

      【讨论】:

        猜你喜欢
        • 2019-04-17
        • 2020-03-22
        • 2021-10-16
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多