Я использовал решение, основанное на предположении, что все, кроме ABD
, CDE
и B
, не имеет отношения к решению или решению.Поэтому я сначала избавляюсь от них с помощью операции фильтрации.
Тогда, что я хочу знать, если есть ABD, за которым следует CDE без B между ними.Я сдвигаю столбец Events
на единицу времени (обратите внимание, что это не должен быть 1 шаг в единицах SeqNo
).
Затем я проверяю каждый столбец нового df: Events==ABD
и Events_1_Step==CDE
, что означает, что между ними не было B
, но, возможно, другие вещи, такие как A
или C
или даже ничего.Это дает мне список логических значений для каждого такого случая.Если я подведу их итог, я получу счет.
Наконец, я должен убедиться, что все это сделано на уровне Id
, поэтому используйте .groupby
.
ВАЖНО: В этом решении предполагается, что ваш dfотсортировано сначала по Id
, а затем по SeqNo
.Если нет, пожалуйста, сделайте это.
import pandas as pd
df = pd.read_csv("path/to/file.csv")
df2 = df[df["Event"].isin(["ABD", "CDE", "B"])]
df2.loc[:,"Event_1_Step"] = df2["Event"].shift(-1)
df2.loc[:,"SeqNo_1_Step"] = df2["SeqNo"].shift(-1)
for id, id_df in df2.groupby("Id"):
print(id) # Set a counter object here per Id to track count per id
id_df = id_df[id_df.apply(lambda x: x["Event"] == "ABD" and x["Event_1_Step"] == "CDE", axis=1)]
for row_id, row in id_df.iterrows():
print(df[(df["Id"] == id) * df["SeqNo"].between(row["SeqNo"], row["SeqNo_1_Step"])])