我有一个pd.DataFrame我想改造:
id values days time value_per_day
0 1 15 15 1 1
1 1 20 5 2 4
2 1 12 12 3 1
我想将这些汇总到10天的相同数据桶中。由于{1}在时间1大于10,所以这应该溢出到下一行,第2行的days
是第1行和第2行的平均值。
以下是结果输出,其中value/day
和(values, 0) = 15*(10/15) = 10
:
(values, 1) = (5+20)/2
我试过 id values days value_per_day
0 1 10 10 1.0
1 1 25 10 2.5
2 1 10 10 1.0
3 1 2 2 1.0
:
pd.Grouper
但我显然错误地使用它。
为方便起见,csv:
df.set_index('days').groupby([pd.Grouper(freq='10D', label='right'), 'id']).agg({'values': 'mean'})
Out[146]:
values
days id
5 days 1 16
15 days 1 10
答案 0 :(得分:2)
注意:这是一个时间成本解决方案
PATCH
我在这里没有包含groupby id,如果你需要真实数据,你可以用newdf=df.reindex(df.index.repeat(df.days))
v=np.arange(sum(df.days))//10
dd=pd.DataFrame({'value_per_day': newdf.groupby(v).value_per_day.mean(),'days':np.bincount(v)})
dd
Out[102]:
days value_per_day
0 10 1.0
1 10 2.5
2 10 1.0
3 2 1.0
dd.assign(value=dd.days*dd.value_per_day)
Out[103]:
days value_per_day value
0 10 1.0 10.0
1 10 2.5 25.0
2 10 1.0 10.0
3 2 1.0 2.0
进行循环,然后在for循环中应用上面的步骤