Фильтр данных 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 последним предыдущим fillna
NaN
с0
- последний бросок
astype