【问题标题】:pandas group by year, id and do some statistics per id? with multiindexpandas 按年分组,id 和每个 id 做一些统计?多索引
【发布时间】:2017-05-18 23:25:43
【问题描述】:

我有一个数据框,它是对两个数据框进行合并操作的子节点。我最终得到一个看起来像 (timestamp,id) 的多索引,并且为了论证,单列 X。

我想按年份和 ID 对 X 进行一些统计。我没有发布我试图盲目解决这个问题的所有疯狂错误,而是问“你会怎么做?”

每个 id 有一行 X,每个周期(每天)。我想汇总到一个年度期间。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我认为您可以将groupbyresample 一起使用并聚合,例如sum,但需要pandas 0.18.1

    start = pd.to_datetime('2016-12-28')
    rng = pd.date_range(start, periods=10)
    df = pd.DataFrame({'timestamp': rng, 'X': range(10), 
                       'id': ['a'] * 3 + ['b'] * 3 + ['c'] * 4 })  
    df = df.set_index(['timestamp','id'])
    print (df)
                   X
    timestamp  id   
    2016-12-28 a   0
    2016-12-29 a   1
    2016-12-30 a   2
    2016-12-31 b   3
    2017-01-01 b   4
    2017-01-02 b   5
    2017-01-03 c   6
    2017-01-04 c   7
    2017-01-05 c   8
    2017-01-06 c   9
    
    df = df.reset_index(level='id')
    print (df.groupby('id').resample('A')['X'].sum())
    id  timestamp 
    a   2016-12-31     3
    b   2016-12-31     3
        2017-12-31     9
    c   2017-12-31    30
    Name: X, dtype: int32
    

    另一种解决方案是使用get_level_valuesgroupby

    print (df.X.groupby([df.index.get_level_values('timestamp').year,
                         df.index.get_level_values('id')])
               .sum())
          id
    2016  a      3
          b      3
    2017  b      9
          c     30
    Name: X, dtype: int32
    

    【讨论】:

      【解决方案2】:

      如果要确保组一起发生,则必须将所有组放在 groupby 中。

      假设您的时间戳在左外组中,以下应该可以工作。

      df.groupby([pd.TimeGrouper('A', level=0), pd.Grouper(level='id')])['X'].sum()
      

      【讨论】:

      • 我想这就是我想要的。自从我问了我的问题后,我得到了非常相似的东西:grp_period_id = df.groupby([pd.TimeGrouper('A'), 'ID'])
      • 好酷。如果您单独使用“ID”,那么它必须是一列,而不是在索引中。
      • 我会说,通向这个简单解决方案的道路上充斥着非常神秘的错误消息和看起来很简单的文档。 pandas 在前端提供生产力(例如合并),而 pandas 在后端带走(例如“为什么不能 I X”)
      猜你喜欢
      • 2021-05-05
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2019-08-12
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多