pandas group by year,id并根据id做一些统计数据?使用多索引

时间:2017-01-04 15:42:12

标签: python pandas pandas-groupby

我有一个数据帧,它是两个数据帧上合并操作的子代。我最终得到了一个看起来像(timestamp,id)的多索引,并且为了参数,一个X列。

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

每个时段(每天)每个ID有一行X.我希望汇总到一个年度时期。

2 个答案:

答案 0 :(得分:0)

我认为您可以将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_values使用groupby

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

答案 1 :(得分:0)

如果您想确保这些群组一起发生,那么您必须将所有群组放在群组中。

假设您的时间戳位于左外组,则以下内容应该有效。

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