Отбросьте аналогичное числовое значение столбца, соответствующее pandas

#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]