2016-08-03 8 views
2

私は複雑な機能をpandas 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のEventType = AとのEventType = 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 

これは、Iグループ現在の実装、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コラムは私が

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

enter image description here

最後に、ヘルパーデータフレームを作成した後timedelta

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

であることを確認する必要があります結合してdf

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

enter image description here

+0

マジック、ありがとう! TimeDeltaではなく、最後のTimeDiff値を分数として取得するには、それを調整する必要がありますが、それは元のものと比較して些細な問題です。 – dasboth

関連する問題