панды: Выберите строки по разнице с предыдущими столбцами, но только один раз в строке

#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