Мне нравится ответ ALollz, но я предпочитаю более визуальный подход.Вот пример, в котором требуется две вставки.
import pandas as pd
import numpy as np
members = ['AA', 'BBB', 'CC', 'DDDD']
non_members = ['EEEE', 'FF', 'GGG', 'HHHHH', 'III', 'JJ']
s = ['AA', 'EEEE', 'GGG', 'CC', 'III', 'JJ']
ser = pd.Series(s)
# view the multiple "frames" from the list in a dataframe
df = pd.DataFrame([ser, ser, ser.shift(-1), ser.shift(-2)],
index=["orig","s", "s+1", "s+2"]).T
orig s s+1 s+2
0 AA AA EEEE GGG
1 EEEE EEEE GGG CC
2 GGG GGG CC III
3 CC CC III JJ
4 III III JJ NaN
5 JJ JJ NaN NaN
Подобно маске, создайте столбец, показывающий, выполняются ли условия.
df["s"] = df["s"].isin(members)
df["s+1"] = df["s+1"].isin(non_members)
df["s+2"] = df["s+2"].isin(non_members)
df["fulfilled"] = df.all(axis=1)
orig s s+1 s+2 fulfilled
0 AA True True True True
1 EEEE False True False False
2 GGG False False True False
3 CC True True True True
4 III False True False False
5 JJ False False False False
получите индекс "1"позиции для вставки в окончательный список s_out.Это просто индекс оригинала плюс индекс только в «истинных» позициях
index = df.loc[df.fulfilled].index
df.loc[index, "index in s_out"] = index + np.arange(1, len(index) + 1)
orig s s+1 s+2 fulfilled index in s_out
0 AA True True True True 1.0
1 EEEE False True False False NaN
2 GGG False False True False NaN
3 CC True True True True 5.0
4 III False True False False NaN
5 JJ False False False False NaN
Вставьте «1» в список s_out в требуемых позициях.
s_out = s.copy()
for i in df["index in s_out"].dropna().astype(int):
s_out.insert(i, "1")
s_out
['AA', '1', 'EEEE', 'GGG', 'CC', '1', 'III', 'JJ']