熊猫集团按行和时间排列的时间排在行前

时间:2017-05-18 06:12:12

标签: python pandas

有趣的问题!

我有一个包含许多列的数据框,但相关的是:id,event_time

ID是可重复的。我试图计算在每行中id的时间之前数据帧中出现id的所有时间。因此,如果id = 43且event_time = 2016-01-01 12:00:00,我想要在此event_time之前发生id 43的所有次数。 event_time已经使用pd.to_datetime()格式化,但它不是索引。

这个循环解决了这个问题,但是400k +行的速度非常慢。

occs=[]
for ix in range(len(df)):
    cur=df.iloc[[ix]]
    occurrences=df[(df.id==cur.id.values[0])&
    (df.event_time < cur.event_time.values[0])]
    occs.append(len(occurrences))
df['total_occ']=occs

知道必须有更好的方法,可能使用group by。关键是它必须是event_time之前的唯一时间,并且它们不是有序的。

谢谢大家!

*编辑样本数据*

 id      |        event_time        |      count
 11               2016-11-09                1
 8                2016-11-10                1
 32               2016-11-08                0
 11               2016-11-08                0
 8                2016-11-11                2
 8                2016-11-07                0

(计数会高得多,成千上万......而且数量是所需的输出)

2 个答案:

答案 0 :(得分:5)

我认为这可能就是你所追求的:

#sort df by id and datetime
df.sort_values(['id','event_time'],inplace=True)
#add cumulative count for each id.
df['count'] = df.groupby('id').cumcount()

df
Out[1114]: 
   id event_time  count
5   8 2016-11-07      0
1   8 2016-11-10      1
4   8 2016-11-11      2
3  11 2016-11-08      0
0  11 2016-11-09      1
2  32 2016-11-08      0

答案 1 :(得分:0)

从您的代码中,我猜你的意思是计算id出现event_time的位置event_timeid相关联的id,这是first_event_times = df.groupby('id', as_index = False).event_time.first().rename(columns = {'first_event':'first_event_time'}) 被视为第一次出现给定df0 = df[['id','event_time']].merge(first_event_times) 的事件时间。

所以弄清楚这些活动时间是什么:

event_time < first_event_time

将这些第一个事件时间与数据帧合并,并仅保留相关列:

df0 = df0[df0.event_time < df0.first_event_time]

向下筛选到id

的行
df0.groupby(['id','first_event_time']).size().to_frame('count') # gives you the desired output

在左边的this.target = (maxValue * (int)Math.random()) + 1; 中获取每个(int)Math.random()的行数:

this.target