【问题标题】:Mean of a grouped-by pandas dataframe with flexible aggregation period具有灵活聚合周期的分组熊猫数据帧的平均值
【发布时间】:2023-03-07 10:56:01
【问题描述】:

作为here,我需要计算列的持续时间和公里的平均值 value ==1 和 values = 0 的行。 这次我希望聚合周期灵活。

df
Out[20]: 
                          Date duration km   value
0   2015-03-28 09:07:00.800001    0      0    0
1   2015-03-28 09:36:01.819998    1      2    1
2   2015-03-30 09:36:06.839997    1      3    1 
3   2015-03-30 09:37:27.659997    nan    5    0 
4   2015-04-22 09:51:40.440003    3      7    0
5   2015-04-23 10:15:25.080002    0      nan  1

对于 1 天的聚合期,我可以使用之前建议的解决方案:

df.pivot_table(values=['duration','km'],columns=['value'],index=df['Date'].dt.date,aggfunc='mean'

ndf.columns = [i[0]+str(i[1]) for i in ndf.columns]

            duration0  duration1  km0  km1
Date                                      
2015-03-28        0.0        1.0  0.0  2.0
2015-03-30        NaN        1.0  5.0  3.0
2015-04-22        3.0        NaN  7.0  NaN
2015-04-23        NaN        0.0  NaN  NaN

但是,我不知道如何更改聚合周期,例如,我想将它作为函数的参数传递...... 出于这个原因,pd.Grouper(freq=freq_aggregation)freq_aggregation = 'd''60s' 的方法将是首选...

【问题讨论】:

    标签: python pandas dataframe group-by pivot-table


    【解决方案1】:

    您可以将 grouper 传递给数据透视表的索引。希望这是您正在寻找的,即

    ndf = df.pivot_table(values=['duration','km'],columns=['value'],index=pd.Grouper(key='Date', freq='60s'),aggfunc='mean')
    ndf.columns = [i[0]+str(i[1]) for i in ndf.columns]
    

    输出:

    持续时间0 持续时间1 km0 km1 日期 2015-03-28 09:07:00 0.0 NaN 0.0 NaN 2015-03-28 09:36:00 NaN 1.0 NaN 2.0 2015-03-30 09:36:00 NaN 1.0 NaN 3.0 2015-03-30 09:37:00 NaN NaN 5.0 NaN 2015-04-22 09:51:00 3.0 NaN 7.0 NaN 2015-04-23 10:15:00 NaN 0.0 NaN NaN

    如果频率是D 那么

    持续时间0 持续时间1 km0 km1 日期 2015-03-28 0.0 1.0 0.0 2.0 2015-03-30 NaN 1.0 5.0 3.0 2015-04-22 3.0 NaN 7.0 NaN 2015-04-23 NaN 0.0 NaN NaN

    【讨论】:

      【解决方案2】:

      让我们使用pd.Grouperunstack 和列映射:

      freq_str = '60s'
      df_out = df.groupby([pd.Grouper(freq=freq_str, key='Date'),'value'])['duration','km'].agg('mean').unstack()
      
      df_out.columns = df_out.columns.map('{0[0]}{0[1]}'.format)
      
      df_out
      

      输出:

                           duration0  duration1  km0  km1
      Date                                               
      2015-03-28 09:07:00        0.0        NaN  0.0  NaN
      2015-03-28 09:36:00        NaN        1.0  NaN  2.0
      2015-03-30 09:36:00        NaN        1.0  NaN  3.0
      2015-03-30 09:37:00        NaN        NaN  5.0  NaN
      2015-04-22 09:51:00        3.0        NaN  7.0  NaN
      2015-04-23 10:15:00        NaN        0.0  NaN  NaN
      

      现在,让我们将 freq_str 更改为 'D':

      freq_str = 'D'
      df_out = df.groupby([pd.Grouper(freq=freq_str, key='Date'),'value'])['duration','km'].agg('mean').unstack()
      
      df_out.columns = df_out.columns.map('{0[0]}{0[1]}'.format)
      
      print(df_out)
      

      输出:

                  duration0  duration1  km0  km1
      Date                                      
      2015-03-28        0.0        1.0  0.0  2.0
      2015-03-30        NaN        1.0  5.0  3.0
      2015-04-22        3.0        NaN  7.0  NaN
      2015-04-23        NaN        0.0  NaN  NaN
      

      【讨论】:

      • 我添加了数据透视表版本
      【解决方案3】:

      使用分组方式

      df = df.set_index('Date')    
      df.groupby([pd.TimeGrouper('D'), 'value']).mean()
      
                       duration   km
      Date       value               
      2017-10-11 0      1.500000  4.0
                 1      0.666667  2.5
      
      
      df.groupby([pd.TimeGrouper('60s'), 'value']).mean()
      
                                 duration   km
      Date                value               
      2017-10-11 09:07:00 0      0.0       0.0
      2017-10-11 09:36:00 1      1.0       2.5
      2017-10-11 09:37:00 0     NaN        5.0
      2017-10-11 09:51:00 0      3.0       7.0
      2017-10-11 10:15:00 1      0.0      NaN 
      

      如果你想把它拆开,那就拆开它。

      df.groupby([pd.TimeGrouper('D'), 'value']).mean().unstack()
      
                 duration        km     
      value             0    1    0    1
      Date                              
      2017-10-11 1.50     0.67 4.00 2.50
      

      【讨论】:

        猜你喜欢
        • 2018-02-01
        • 2016-03-03
        • 2021-06-14
        • 1970-01-01
        • 2017-08-03
        • 2018-02-08
        • 2018-05-15
        • 2019-04-16
        • 2021-09-25
        相关资源
        最近更新 更多