我有一个包含以下列的数据框:
(Pdb) self.df.columns
Index([u'distinct_id', u'event_name', u'item_id', u'player_time', u'time',
u'video_id'],
dtype='object')
player_time
是一个浮点值,它不是唯一的。我的最终目标是计算在任何给定秒钟(event_name
)发生的事件数量(player_time
),然后根据需要在不同的时间间隔内执行滚动总和:
要获得在任何给定秒钟内发生的事件数量,我可以使用groupby:
(Pdb) grouped_df = self.df.groupby(self.df.player_time).count(); grouped_df
distinct_id event_name item_id time video_id
player_time
16 1 1 1 1 1
25 0 2 1 1 1
28 1 1 1 1 1
29 1 1 1 1 1
36 1 1 1 1 1
46 1 1 1 1 1
70 1 1 1 1 1
77 1 1 1 1 1
95 1 1 1 1 1
107 1 1 1 1 1
117 1 1 1 1 1
118 1 1 1 1 1
131 0 2 1 1 1
153 1 1 1 1 1
155 1 1 1 1 1
163 1 1 1 1 1
177 1 1 1 1 1
182 1 1 1 1 1
183 1 1 1 1 1
196 1 1 1 1 1
正如你所看到的那样,除了25和131之外,每秒钟每秒钟有一个事件。现在我想做的事情就像是
(Pdb) grouped_df.resample('10s',how='sum')
*** TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex
但我现在没有立即这样做。实现这一目标的最佳方法是什么?我看了pandas.rolling_sum
,看起来它也可以完成这项工作,我只是不能把它做到我在这里所描述的。
答案 0 :(得分:1)
考虑一系列求和函数并将其应用于groupby()
:
# RESET TO DATA FRAME
grouped_df = self.df.groupby(self.df.player_time).count().reset_index()
# SERIES SUM FUNCTION (SUMS EVERY LAST 10 VALUES OF PLAYER_TIME)
def intsum(x):
if x < 10:
ser = groupdf.event_name[(groupdf.player_time < x)]
else:
ser = groupdf.event_name[(groupdf.player_time >= x - 10) & (groupdf.player_time < x)]
return ser.sum()
# APPLY FUNCTION
groupdf['intervalSum'] = groupdf['player_time'].apply(intsum)
print(groupdf)
<强>输出强>
player_time distinct_id event_name item_id time video_id intervalSum
0 16 1 1 1 1 1 0
1 25 0 2 1 1 1 1
2 28 1 1 1 1 1 2
3 29 1 1 1 1 1 3
4 36 1 1 1 1 1 2
5 46 1 1 1 1 1 1
6 70 1 1 1 1 1 0
7 77 1 1 1 1 1 1
8 95 1 1 1 1 1 0
9 107 1 1 1 1 1 0
10 117 1 1 1 1 1 1
11 118 1 1 1 1 1 1
12 131 0 2 1 1 1 0
13 153 1 1 1 1 1 0
14 155 1 1 1 1 1 1
15 163 1 1 1 1 1 2
16 177 1 1 1 1 1 0
17 182 1 1 1 1 1 1
18 183 1 1 1 1 1 2
19 196 1 1 1 1 1 0