我有一个数据框,其中包含全天定期抽样的网站点击总数的多天时间序列数据。每个新的一天,计数重置为零。因此,在第一天结束时,计数已达到9次点击。然后在第2天,计数再次从0开始,并在当天结束时达到8次点击......等等
day value time
------------------------
1 0 00:45:00
1 5 02:15:00
1 8 06:55:00
1 9 13:10:00
2 0 00:10:00
2 1 01:00:00
2 7 05:15:00
2 8 11:45:00
3 0 03:00:00
3 4 07:30:00
3 7 15:30:00
我想将各个日子聚合在一起,形成一个累积的时间序列。
day value time
------------------------
1 0 00:45:00
1 5 02:15:00
1 8 06:55:00
1 9 13:10:00
2 9 00:10:00
2 10 01:00:00
2 16 05:15:00
2 17 11:45:00
3 17 03:00:00
3 21 07:30:00
3 24 15:30:00
Pandas有办法有效地做到这一点吗? 非常感谢你的帮助。
答案 0 :(得分:2)
你真的在询问有争议的群体(而不是标准的群体,而忽略了同一群体中的物品是否相邻)所以我认为你需要使用差异:
In [11]: df['day'].diff().astype(bool)
0 True
1 False
2 False
3 False
4 True
5 False
6 False
7 True
8 False
9 False
Name: day, dtype: bool
注意:NaN转换为True!如果您可以保证每个组都是非空的并且每次都在增加,那么astype(bool)
也不是绝对必要的。
然后,您可以将其乘以相应的(最后)值:
In [12]: previous = (df.day.diff() * df['value'].shift())
In [13]: previous
Out[13]:
0 NaN
1 0
2 0
3 0
4 9
5 0
6 0
7 8
8 0
9 0
dtype: float64
我可能只是将第一个值设置为0(您可以使用fillna(0)
作为单行):
In [14]: previous.iloc[0] = 0
现在,添加这个的结果可以得到你想要的结果:
In [15]: df['value'] + previous.cumsum()
Out[15]:
0 0
1 5
2 8
3 9
4 10
5 16
6 17
7 17
8 21
9 24
dtype: float64
答案 1 :(得分:0)
我会做那样的事情
import pandas as pd
df=pd.DataFrame({'day':[1, 1, 1, 1, 2, 2, 2 , 3, 3, 3],\
'value':[0 ,5 ,8 ,9 ,1 ,7 ,8 ,0 ,4 ,7]})
# Evaluate the offset to add
dd=df.groupby('day').max().cumsum()
df.set_index('day',inplace=True)
# Creation of offset dataframe
dd.index += 1
# Delete the last row
dd=dd[0:-1]
# Evaluate the first row
dd=dd.append(pd.DataFrame({'value':[0]},index=[df.index[0]]))
# Perform the addition
df = df.add(dd)
导致
value
1 0
1 5
1 8
1 9
2 10
2 16
2 17
3 17
3 21
3 24