#python #pandas
Вопрос:
У меня есть набор данных, как показано ниже
ID value
1 10
2 15
3 18
4 30
5 35
Я хотел бы сохранить все строки, которые имеют значение — значение предыдущей строки
df['diff'] = df.value.diff()
df = df[df.diff <= 5]
Тогда у меня будет
ID value diff
2 15 5
3 18 3
5 35 5
Однако я не хочу сохранять строку 3, потому что строка 2 сохраняется из-за строки 1, и поскольку строка 1 и строка 2 становятся парой, строка 3 больше не должна быть сопряжена со строкой 2.
Как я мог это сделать, используя панд? Действительно, я могу написать цикл for, но это не лучшая идея.
Ответ №1:
Таким образом, у вас есть маска, которая проверяет, отличается ли она от предыдущей строки:
>>> d = df.value.diff().le(5)
>>> d
1 False
2 True
3 True
4 False
5 True
Строки, отмеченные знаком True
, будут сохранены, но вы не хотите сохранять Истинную строку, если предыдущая строка также была Истинной.
Затем мы можем сдвинуть эту маску, отрицать ее и amp;
с помощью оригинала преобразовать True
те, которые были True
в предыдущей строке, в False
:
>>> d amp; ~d.shift(fill_value=False)
1 False
2 True
3 False
4 False
5 True
там, где fill_value
это необходимо в противном случае, возникает NaN, и он «не может побитово отрицать поплавок». Помещение False
туда не имеет никакого эффекта, кроме как замалчивания этой проблемы.
Теперь мы можем выбрать строки из фрейма данных с помощью этой результирующей маски:
>>> wanted = d amp; ~d.shift(fill_value=False)
>>> df[wanted]
ID value
2 15
5 35