2016-08-03 51 views
2

我試圖將一個複雜的函數應用於熊貓的DataFrame,我想知道是否有更快的方法來做到這一點。我的數據的簡化版本是這樣的:提高在熊貓同一個DataFrame中的交叉引用行的速度

UID,UID2,Time,EventType 
1,1,18:00,A 
1,1,18:05,B 
1,2,19:00,A 
1,2,19:03,B 
2,6,20:00,A 
3,4,14:00,A 

我想要做的就是UID和UID2的每個組合是否存在既是一個與事件類型= A和事件類型= B行,然後計算出時差,然後將其添加回新列。因此,新的數據集將是:

UID,UID2,Time,EventType,TimeDiff 
1,1,18:00,A,5 
1,1,18:05,B,5 
1,2,19:00,A,3 
1,2,19:03,B,3 
2,6,20:00,A,nan 
3,4,14:00,A,nan 

這是當前實現,在這裏我按UID和UID2的記錄,那麼只有行的一小部分進行搜索,以確定兩者是否事件類型存在。我無法找出更快的方法,而在PyCharm中進行分析並沒有幫助發現瓶頸。

for (uid, uid2), group in df.groupby(["uid", "uid2"]): 
    # if there is a row for both A and B for a uid, uid2 combo 
    if len(group[group["EventType"] == "A"]) > 0 and len(group[group["EventType"] == "D"]) > 0: 
     time_a = group.loc[group["EventType"] == "A", "Time"].iloc[0] 
     time_b = group.loc[group["EventType"] == "B", "Time"].iloc[0] 

     timediff = time_b - time_a 
     timediff_min = timediff.components.minutes 

     df.loc[(df["uid"] == uid) & (df["uid2"] == uid2), "TimeDiff"] = timediff_min 

回答

1

我需要確保Time列是timedelta

df.Time = pd.to_datetime(df.Time) 
df.Time = df.Time - pd.to_datetime(df.Time.dt.date) 

後,我創建一個幫助數據幀

df1 = df.set_index(['UID', 'UID2', 'EventType']).unstack().Time 
df1 

enter image description here

最後,我把diff和合併到df

df.merge((df1.B - df1.A).rename('TimeDiff').reset_index()) 

enter image description here

+0

魔術,謝謝!我需要調整它以將最後一次TimeDiff值作爲分鐘數而不是timedelta,但與原始數據相比,這是一個微不足道的問題。 – dasboth