删除相似列数值匹配pandas
Drop similar column numerical value match pandas
对于下面的 pandas 数据框,我想删除 video
和 view
值相等且四列中的两列 left, width, top, height
位于其中的所有行+-1 彼此。因此在下面的示例中,第二行 (width, height) 是 (20, 14),第三行 (width, height) 是 (21, 15),因此应该删除这两行中的一行,因为这些行共享width
和 height
列中的 +-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
...
谢谢!
不知道这是否足够准确。它不一定会削减 1 秒内的所有实例,但一些小的调整就可以解决问题。此外,我假设您更关心“width/height”和“left/top”分组,而不是这四种组合中的任何组合。无论如何,您只需要对您真正关心的任何组重新进行此转换,直至所有排列。为了简洁起见,我省略了“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
创建两个蒙版:
- 对于
view
和 video
:使用 .shift
+.eq
检查前一行是否相同
- For
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]
对于下面的 pandas 数据框,我想删除 video
和 view
值相等且四列中的两列 left, width, top, height
位于其中的所有行+-1 彼此。因此在下面的示例中,第二行 (width, height) 是 (20, 14),第三行 (width, height) 是 (21, 15),因此应该删除这两行中的一行,因为这些行共享width
和 height
列中的 +-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
...
谢谢!
不知道这是否足够准确。它不一定会削减 1 秒内的所有实例,但一些小的调整就可以解决问题。此外,我假设您更关心“width/height”和“left/top”分组,而不是这四种组合中的任何组合。无论如何,您只需要对您真正关心的任何组重新进行此转换,直至所有排列。为了简洁起见,我省略了“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
创建两个蒙版:
- 对于
view
和video
:使用.shift
+.eq
检查前一行是否相同
- For
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]