Фильтр данных в pandas по последовательности значений в определенном столбце - PullRequest
0 голосов
/ 05 сентября 2018

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

A B C

1 2 3

2 3 4

3 8 7

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

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

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Использование 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
0 голосов
/ 05 сентября 2018

Вы можете использовать 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 последним предыдущим
  • fillna NaN с 0
  • последнее приведение к булу на astype
...