使用 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。
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。