有趣的问题!
我有一个包含许多列的数据框,但相关的是: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
(计数会高得多,成千上万......而且数量是所需的输出)
答案 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_time
与id
相关联的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