#python #pandas #numpy #machine-learning #data-science
#python #pandas #numpy #машинное обучение #наука о данных
Вопрос:
Для приведенного ниже фрейма данных pandas я хочу удалить все строки, где video
view
значения и равны, а два из четырех столбцов left, width, top, height
находятся в пределах -1 друг от друга. Итак, в приведенном ниже примере вторая строка (ширина, высота) равна (20, 14), третья строка (ширина, высота) равна (21, 15), поэтому одна из этих двух строк должна быть удалена, потому что эти строки имеют значения -1 в width
height
столбце и .
view video left width top height
Endzone 57906_000718_Endzone.mp4 372 17 279 17
Endzone 57906_000718_Endzone.mp4 851 20 273 14
Endzone 57906_000718_Endzone.mp4 853 21 271 15
Endzone 57906_000718_Endzone.mp4 855 21. 267 16
Endzone 57906_000718_Endzone.mp4 857 21. 265 17
Sideline 57906_000718_Sideline.mp4 763 18. 98 26
...
Пример вывода, вывод может варьироваться в зависимости от метода удаления:
view video left width top height
Endzone 57906_000718_Endzone.mp4 372 17 279 17
Endzone 57906_000718_Endzone.mp4 851 20 273 14
Endzone 57906_000718_Endzone.mp4 857 21. 265 17
Sideline 57906_000718_Sideline.mp4 763 18. 98 26
...
Спасибо!
Комментарии:
1. Что такое row1 и row2? Пожалуйста, добавьте ожидаемый результат
2. пожалуйста, укажите простой ввод и пример вывода
3. строки 1 и строки 2 являются примерами строк в df. спасибо.
Ответ №1:
Не знаю, достаточно ли это точно. Это не обязательно сокращает все экземпляры, которые находятся в пределах 1 секунды, но некоторые небольшие изменения помогут. Кроме того, я предполагаю, что вы больше заботитесь о группировках «ширина / высота» и «слева / сверху», чем о любой комбинации из четырех. В любом случае, вам просто нужно повторить это преобразование для любых групп, которые вас действительно интересуют, вплоть до всех перестановок. Для краткости я опустил группировку «слева / сверху», но это просто повторение этого.
> df[df.index.isin(df[['view', 'video']].join(df[['width', 'height']]//2).drop_duplicates().index)
view video left width top height
0 Endzone 57906_000718_Endzone.mp4 372 17.0 279 17
1 Endzone 57906_000718_Endzone.mp4 851 20.0 273 14
3 Endzone 57906_000718_Endzone.mp4 855 21.0 267 16
5 Sideline 57906_000718_Sideline.mp4 763 18.0 98 26
Ответ №2:
Создайте две маски:
- Для
view
иvideo
: проверьте, совпадает ли предыдущая строка, используя.shift
.eq
- Для
dimensions
:diff
предыдущей строки и проверьте, находятся ли какие-либо две из них в [-1,1]
col1_2_mask = df[["view","video"]].shift(1).eq(df[["view","video"]]).sum(1)<2
lwth_mask = df.iloc[:,2:].diff().isin(range(-1,2)).sum(1)<2
df[col1_2_mask | lwth_mask]
col1_2_mask = df[["view","video"]].shift(1).eq(df[["view","video"]]).sum(1)<2
lwth_mask = df.iloc[:,2:].diff().isin(range(-1,2)).sum(1)<2
df[col1_2_mask | lwth_mask]