使用 shift 侧翼数据

Flanking data by using shift

shift() 在此代码中的工作原理。我试图在我的数据框中获取一些 True 值,然后将我的选择扩展到下一个向上和向下 4 False 值。 我的 DataFrame 示例:

df Out[89]: TRACK_ID FRAME match 290 1667.0 350.0 False 291 1667.0 352.0 False 292 1667.0 353.0 False 293 1667.0 354.0 False 294 1668.0 348.0 False 295 1668.0 349.0 False 296 1668.0 350.0 False 297 1668.0 351.0 True 298 1668.0 352.0 True 299 1668.0 353.0 True 300 449.0 87.0 False 301 449.0 88.0 False 302 449.0 89.0 False 303 449.0 90.0 False 304 449.0 91.0 False 305 449.0 92.0 False

我正在使用这行代码提取 True 行并立即提取上下 4 行:

df1 = df[df.match | df.match.shift(np.round(-4,0)) | df.match.shift(np.round(4,0))] 

但是我的输出是跳过(删除)上下第一个索引(索引 296 和 300):

df1 Out[97]: TRACK_ID FRAME match 293 1667.0 354.0 False 294 1668.0 348.0 False 295 1668.0 349.0 False 297 1668.0 351.0 True 298 1668.0 352.0 True 299 1668.0 353.0 True 301 449.0 88.0 False 302 449.0 89.0 False 303 449.0 90.0 False

我不明白为什么会这样,欢迎任何建议!

你的条件是一个掩码,"shifts" 值是 4 行,仅此而已。

df.match | df.match.shift(np.round(-4,0)) | df.match.shift(np.round(4,0))
#290    False
#291    False
#292    False
#293     True
#294     True
#295     True
#296    False
#297     True
#298     True
#299     True
#300    False
#301     True
#302     True
#303     True
#304    False
#305    False

您正在使用它过滤数据框,因此 "deleting" 您的条件不正确的行。听起来你宁愿将这些行标记为假,在这种情况下你不想过滤,你想更新数据框

df['updated_match'] = df.match | df.match.shift(np.round(-4,0)) | df.match.shift(np.round(4,0))

然后 df 看起来像:

   TRACK_ID FRAME   match   updated_match
290 1667.0  350.0   False   False
291 1667.0  352.0   False   False
292 1667.0  353.0   False   False
293 1667.0  354.0   False   True
294 1668.0  348.0   False   True
295 1668.0  349.0   False   True
296 1668.0  350.0   False   False
297 1668.0  351.0   True    True
298 1668.0  352.0   True    True
299 1668.0  353.0   True    True
300 449.0   87.0    False   False
301 449.0   88.0    False   True
302 449.0   89.0    False   True
303 449.0   90.0    False   True
304 449.0   91.0    False   False
305 449.0   92.0    False   False

编辑: 重新阅读问题并意识到您的问题。

我认为与其使用 shift(),不如使用 4 行的滚动最大值 window。在两个方向(向前和向后)使用 .rolling()

df1 = 
df[df.match |
   df['match'].iloc[::-1].rolling(window=4).max().fillna(0).astype(bool) |
   df['match'].rolling(window=4).max().fillna(0).astype(bool)
  ]

输出:

#   TRACK_ID    FRAME   match
#294    1668.0  348.0   False
#295    1668.0  349.0   False
#296    1668.0  350.0   False
#297    1668.0  351.0   True
#298    1668.0  352.0   True
#299    1668.0  353.0   True
#300    449.0   87.0    False
#301    449.0   88.0    False
#302    449.0   89.0    False

这保留了您调用的 296 和 300。