2015-12-08 97 views
1

我有以下各列的數據幀:使用大熊貓重新取樣/ rolling_sum計算秒的時間間隔

(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是一個浮點值,這不是唯一的。我的最終目標是計算在任意給定秒(player_time)發生的事件數(event_name),然後如果需要,請執行跨不同時間間隔的滾動和:

要獲取發生在任何鑑於第二,我可以使用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,看起來它也可以做這項工作,我只是不能讓它做我在這裏描述的。

回答

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 
+0

真棒 - 感謝你 - 什麼是reset_index通話的目的是什麼? – josephmisiti

+0

太棒了! 'reset_index()'是將pandas groupby對象轉換回數據框(填充所有行)。 Groupbys保持分層索引。如果不需要,刪除。 – Parfait