Как фильтровать строки на основе связанного с порядком ограничения?

У меня есть следующий фреймворк:

df = ID TYPE VD_0 VD_1 VD_2 VD_3 1 ABC V1234 456 123 564 2 DBC 456 A45 123 564 3 ABD 456 V1234 456 123 4 ABD 123 V1234 SSW 123 

Существует следующий список значений VD_0 , VD_1 , VD_2 и VD_3 :

 myList = [V1234,456,A45] 

Я хочу получить только те строки в df которые имеют 2 секвенциальных myList значений из myList в столбцах VD_0 , VD_1 , VD_2 и VD_3 .

В результате получается следующее:

 result = ID TYPE VD_0 VD_1 VD_2 VD_3 1 ABC V1234 456 123 564 2 DBC 456 A45 123 564 3 ABD 456 V1234 456 123 

Например, в строке с ID 1 значения VD_0 и VD_1 равны соответственно V1234 и 456 , и оба этих значения принадлежат myList . Та же логика применяется к строкам с ID 2 ( 456 , A45 ) и 3 ( 456 , V1234 ).

Как мне это сделать?

Я согласен с началом ответа MaxU, но конец должен быть проще IIUC. Фильтр, который вы хотите, должен получить 2 последовательных матча из вашего списка. Вы можете получить этот ответ, сказав, что вы хотите, чтобы строка за строкой была равна, по крайней мере, 2, если вы суммируете их по два. Это называется суммой 2-периодного окна прокатки вдоль оси = 1. Затем вы берете максимальное значение каждой строки, а совпадения имеют большее или равное значение, чем 2:

 subset = df.filter(like='VD_') df[subset.isin(myList).rolling(2, axis=1).sum().max(axis=1)>=2] Out[26]: ID TYPE VD_0 VD_1 VD_2 VD_3 0 1 ABC V1234 456 123 564 1 2 DBC 456 A45 123 564 2 3 ABD 456 V1234 456 123 

Попробуй это:

 In [112]: subset = df.filter(like='VD_') In [113]: df[subset[subset.isin(myList)].stack().duplicated().unstack().any(1)] Out[113]: ID TYPE VD_0 VD_1 VD_2 VD_3 1 2 DBC 456 A45 123 564 2 3 ABD 456 V1234 456 123 3 4 ABD 123 V1234 SSW 123 

Пояснения:

 In [114]: subset Out[114]: VD_0 VD_1 VD_2 VD_3 0 V1234 456 123 564 1 456 A45 123 564 2 456 V1234 456 123 3 123 V1234 SSW 123 In [115]: subset.isin(myList) Out[115]: VD_0 VD_1 VD_2 VD_3 0 True True False False 1 True True False False 2 True True True False 3 False True False False In [116]: subset[subset.isin(myList)] Out[116]: VD_0 VD_1 VD_2 VD_3 0 V1234 456 NaN NaN 1 456 A45 NaN NaN 2 456 V1234 456 NaN 3 NaN V1234 NaN NaN In [118]: subset[subset.isin(myList)].stack() Out[118]: 0 VD_0 V1234 VD_1 456 1 VD_0 456 VD_1 A45 2 VD_0 456 VD_1 V1234 VD_2 456 3 VD_1 V1234 dtype: object In [119]: subset[subset.isin(myList)].stack().duplicated() Out[119]: 0 VD_0 False VD_1 False 1 VD_0 True VD_1 False 2 VD_0 True VD_1 True VD_2 True 3 VD_1 True dtype: bool In [120]: subset[subset.isin(myList)].stack().duplicated().unstack() Out[120]: VD_0 VD_1 VD_2 0 False False None 1 True False None 2 True True True 3 None True None In [121]: subset[subset.isin(myList)].stack().duplicated().unstack().any(1) Out[121]: 0 False 1 True 2 True 3 True dtype: bool