簡體   English   中英

計算大型數據集中元素的所有過去出現次數

[英]Count all past occurences of an element in a large dataset

我有一個非常大的數據幀(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秒!

我想知道如何擴展它,以便我可以有效地創建一個列。

IIUC你可以這樣做:

In [69]: df['number_of_past_services'] = df.sort_values('date_of_service') \
                                           .assign(x=1) \
                                           .groupby('service_id')['x'].cumsum()

In [70]: df
Out[70]:
      date_of_service service_id user_id  number_of_past_services
0 2015-06-10 17:00:00         73     100                        2
1 2014-09-27 17:00:00         73     101                        1
2 2015-01-12 17:00:00         46     102                        1
3 2012-08-22 17:00:00         12     103                        1
4 2013-03-07 17:00:00         12     104                        2

如果我理解正確,你可以:

  • date_of_service對數據進行date_of_service
  • 創建一個過去發生的空字典
  • 迭代所有已排序的行:
    • past_occurences.get(user_id, 0)保存您需要的信息
    • past_occurences[user_id] = past_occurences.get(user_id, 0) + 1將更新字典。

在所有步驟中,排序將是最慢的。 其余的應該相當快。

PS:你也可以使用defaultdict 這是一個例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM