我有一个数据帧,它是两个数据帧上合并操作的子代。我最终得到了一个看起来像(timestamp,id)的多索引,并且为了参数,一个X列。
我想按年度和ID进行几项X统计。我没有发布所有我试图盲目解决这个问题的疯狂错误,而是问你会怎么做?"
每个时段(每天)每个ID有一行X.我希望汇总到一个年度时期。
答案 0 :(得分:0)
我认为您可以将groupby
与resample
一起使用并汇总,例如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()