删除类似列的数值匹配项

2024-09-30 05:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

对于下面的pandas数据帧,我想删除videoview值相等且四列中的两列left, width, top, height彼此在+-1范围内的所有行。因此,在下面的示例中,第二行(宽度,高度)是(20,14),第三行(宽度,高度)是(21,15),因此应该删除这两行中的一行,因为这些行在widthheight列中共享+-1值

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
...

谢谢大家!


Tags: 数据view示例pandas宽度高度topvideo
2条回答

我不知道这是否足够准确。它不一定会剪切1秒内的所有实例,但是一些小的调整就可以了。另外,我假设您更关心“宽度/高度”和“左/顶”分组,而不是四个组合。不管怎样,您只需对您真正关心的任何组重新执行此转换,直到所有排列。为了简洁起见,我省略了“left/top”分组,但这只是重复

> 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

创建两个遮罩:

  • 对于viewvideo:使用.shift+.eq检查前一行是否相同
  • 对于dimensionsdiff上一行,检查其中是否有任何两行在[-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]

相关问题 更多 >

    热门问题