【发布时间】:2023-04-02 15:07:01
【问题描述】:
我有一个相当大的数据框(300 万行),如下所示:
df = pd.DataFrame({'user_id' : ['100','101','102','103','104'],
'service_id' : ['73', '73', '46', '12', '12'],
'date_of_service' : ['2015-06-10 17:00:00',
'2014-09-27 17:00:00',
'2015-01-12 17:00:00',
'2012-08-22 17:00:00',
'2013-03-07 17:00:00']})
df
我有一个用户 ID 列。用户正在提供服务,每个服务都有一个 id (service_id)。每个服务都有一个日期 (date_of_service)。
我想创建一个列,为每一行计算用户过去(包括现在)完成的服务数量,即我想要以下结果数据框:
df = pd.DataFrame({'user_id' : ['100','101','102','103','104'],
'service_id' : ['73', '73', '46', '12', '12'],
'date_of_service' : ['2015-06-10 17:00:00',
'2014-09-27 17:00:00',
'2015-01-12 17:00:00',
'2012-08-22 17:00:00',
'2013-03-07 17:00:00'],
'number_of_past_services' : [2, 1, 1, 1, 2]})
df
我做了什么
我使用了 groupby 和 count:
df['count_services'] = df.ix[:, 1:].groupby('user_id').transform('count')
问题是,在这里,我计算了整个数据集中所有出现的次数。我想要的是有过去的事件!
我尝试过使用类似sql的操作进行过滤,例如:
len(df[df.date_of_service < df['date_of_service'][0]][df.user_id == df.user_id[0]])
这为第一行提供了良好的结果。但是,这个计算只需要 1 秒左右!
我想知道如何扩展它,以便我可以有效地创建一列。
【问题讨论】:
标签: python performance date pandas group-by