Фильтр данных pandas по последовательности значений в определенном столбце

У меня есть датафрейм

азбука

1 2 3

2 3 4

3 8 7

Я хочу взять только строки, где есть последовательность 3,4 в столбцах C (в этом сценарии - первые две строки)

Каков будет лучший способ сделать это?

2 ответа

Решение

Использование shift

In [1085]: s = df.eq(3).any(1) & df.shift(-1).eq(4).any(1)

In [1086]: df[s | s.shift()]
Out[1086]:
   A  B  C
0  1  2  3
1  2  3  4

Ты можешь использовать rolling для общего решения, работающего с любым шаблоном:

pat = np.asarray([3,4])
N = len(pat)

mask= (df['C'].rolling(window=N , min_periods=N)
              .apply(lambda x: (x==pat).all(), raw=True)
              .mask(lambda x: x == 0) 
              .bfill(limit=N-1)
              .fillna(0)
              .astype(bool))

df = df[mask]
print (df)
   A  B  C
0  1  2  3
1  2  3  4

Пояснение:

  • использование rolling.apply и тестовый шаблон
  • замещать 0 с NaN с mask
  • использование bfill с limit для заполнения первых значений NAN последним предыдущим
  • fillnaNaN с 0
  • последний бросок astype
Другие вопросы по тегам