【发布时间】:2017-05-18 23:25:43
【问题描述】:
我有一个数据框,它是对两个数据框进行合并操作的子节点。我最终得到一个看起来像 (timestamp,id) 的多索引,并且为了论证,单列 X。
我想按年份和 ID 对 X 进行一些统计。我没有发布我试图盲目解决这个问题的所有疯狂错误,而是问“你会怎么做?”
每个 id 有一行 X,每个周期(每天)。我想汇总到一个年度期间。
【问题讨论】:
标签: python pandas pandas-groupby
我有一个数据框,它是对两个数据框进行合并操作的子节点。我最终得到一个看起来像 (timestamp,id) 的多索引,并且为了论证,单列 X。
我想按年份和 ID 对 X 进行一些统计。我没有发布我试图盲目解决这个问题的所有疯狂错误,而是问“你会怎么做?”
每个 id 有一行 X,每个周期(每天)。我想汇总到一个年度期间。
【问题讨论】:
标签: python pandas pandas-groupby
我认为您可以将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
【讨论】:
如果要确保组一起发生,则必须将所有组放在 groupby 中。
假设您的时间戳在左外组中,以下应该可以工作。
df.groupby([pd.TimeGrouper('A', level=0), pd.Grouper(level='id')])['X'].sum()
【讨论】: