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