2017-07-16 63 views
0

我有一个有两列 - “日”和“事件”的熊猫数据框。在每一天,可以发生任意数量的事件,每个事件都由char表示。我想构建一个额外的列,指示自上次事件发生以来已经过去了多少天。下面的代码可以说明这一点:Python 3.6:Pandas - 获取较早的DataFrame列的条目发生

>>> import pandas as pd 
>>> event_data = pd.DataFrame({'Day':[1,1,1,1,2,2,2,3,3,4,4,4,4], 
          'Event':['A','B','C','D','B','F','A','B','C','G','A','B','D']}) 
>>> print(event_data) 

    Day Event 
0  1  A 
1  1  B 
2  1  C 
3  1  D 
4  2  B 
5  2  F 
6  2  A 
7  3  B 
8  3  C 
9  4  G 
10 4  A 
11 4  B 
12 4  D 

我想的附加列“days_since_event”将如下所示:

Day Event Days_since_event 
0  1  A    -1 
1  1  B    -1 
2  1  C    -1 
3  1  D    -1 
4  2  B     1 
5  2  F    -1 
6  2  A     1 
7  3  B     1 
8  3  C     2 
9  4  G    -1 
10 4  A     2 
11 4  B     1 
12 4  D     3 

第12行具有值3作为事件“d”发生在第4天,并之前的事件发生在第1天,这意味着事件'D'最后一次发生后已过去3天。值为-1的行表示该事件在当天的第一次发生。

什么是这样做的计算最佳方式?原始数据集有超过1000万行,使用循环或重复数据子集过慢。

回答

3

你可以按Event列数据框和计算Day一个diff这样的:

event_data['Days_since_event'] = event_data.groupby('Event')['Day']\ 
              .diff().fillna(-1).astype(int) 

每一个事件的发生首先将有NaN值,所以我填那些-1你的问题中所描述的。

+0

工程就像一个魅力。谢谢,dune_dweller :) –