2014-07-14 59 views
0

我有一個相當大的約200萬條記錄的數據集,每個記錄都有一個開始時間和一個結束時間。我想插入字段到每個計數多少記錄有在表中的記錄:使用當前行作爲條件的大熊貓累計總和

  • 啓動時間小於或等於「該行」的開始時間
  • 和END時間大於「這一行」的開始時間

因此,基本上每個記錄最後都會包含多少個事件(包括它本身)與它同時處於「活動」狀態。

我一直在試圖教自己的熊貓做到這一點,但我甚至不知道從哪裏開始尋找。我可以找到很多符合給定條件(例如「> 2」)的行的求和示例,但似乎無法掌握如何遍歷行以根據當前行中的值有條件地求和列。

+0

我很困惑你想要什麼。你可以請更具體嗎?假設row_1有start_time = 4和end_time = 7,row_2有start_time = 3和end_time = 5,row_3有start_time = 1和end_time = 3,row_4有start_time = 2和end_time = 8。你想要什麼輸出? – exp1orer

+0

剛纔意識到我在上面說錯了。它應該計算在該記錄的*開始*時間內仍然活動的事件。所以在你的例子中,你會得到這個: Row_1:開始:4結束:7併發:3 | Row_2:開始:3結束:5併發:2 | Row_3:開始:1結束:3併發:1 | Row_4:開始:2結束:8併發:2 – user3838505

+0

所以問題是「當這個入口開始時還有多少行被激活」? – exp1orer

回答

0

您可以嘗試下面的代碼來獲得最終結果。

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.array([[2,10],[5,8],[3,8],[6,9]]),columns=["start","end"]) 

active_events= {} 
for i in df.index: 
    active_events[i] = len(df[(df["start"]<=df.loc[i,"start"]) & (df["end"]> df.loc[i,"start"])]) 
last_columns = pd.DataFrame({'No. active events' : pd.Series(active_events)}) 

df.join(last_columns) 
0

在這裏。這將是緩慢的。

注意,這個計算每一行與自身重疊,這樣的成績列將永遠爲0

import pandas as pd 
df = pd.DataFrame({'start_time': [4,3,1,2],'end_time': [7,5,3,8]}) 
df = df[['start_time','end_time']] #just changing the order of the columns for aesthetics 

def overlaps_with_row(row,frame): 
    starts_before_mask = frame.start_time <= row.start_time 
    ends_after_mask = frame.end_time > row.start_time 
    return (starts_before_mask & ends_after_mask).sum() 

df['number_which_overlap'] = df.apply(overlaps_with_row,frame=df,axis=1) 

收益率(從結果中減去1做它的其他方式。):

In [8]: df 
Out[8]: 
    start_time end_time number_which_overlap 
0   4   7      3 
1   3   5      2 
2   1   3      1 
3   2   8      2 

[4 rows x 3 columns] 
+0

在多分鐘內緩慢運行在具有2M行的數據幀上。 – exp1orer

+0

我最終這樣做了:'for i in a.index: active [i] = len(a [(a ['Start'] <= a.loc [i,'Start'])&(a ['結束']> a.loc [i,'開始'])])'。你認爲速度更慢,速度更快還是更快? – user3838505