[英]in Pandas how to replace a zero value with the nearest non nan value?
[英]How many steps to the nearest zero value
尋求解決看似簡單的算法的幫助。
簡要概述:我們有一個未排序的整數列表。 目標是找出此列表中的每個元素與最近的“0”值的距離。
所以如果我們有一個類似這樣的列表: [0, 1, 2, 0, 4, 5, 6, 7, 0, 5, 6, 9]
預期結果將是: [0, 1, 1, 0, 1, 2, 2, 1, 0, 1, 2, 3]
我試圖簡化問題以提出一些簡單的算法,但我不知道如何跟蹤前一個和下一個零值。 我最初的想法是找出列表中零的所有索引,並用值填補這些零之間的空白,但這顯然對我來說不太奏效。
執行不佳的代碼(到目前為止,我只是將步驟倒數到下一個零):
def get_empty_lot_index(arr: list) -> list:
''' Gets all indices of empty lots '''
lots = []
for i in range(len(arr)):
if arr[i] == 0:
lots.append(i)
return lots
def space_to_empty_lots(arr: list) -> list:
empty_lots = get_empty_lot_index(arr)
new_arr = []
start = 0
for i in empty_lots:
steps = i - start
while steps >= 0:
new_arr.append(steps)
steps -= 1
start = i + 1
return new_arr
一種可能的算法是對輸入列表進行兩次掃描:一次向前,一次向后。 每次保留最后遇到的0的索引並存儲差異。 在第二次掃描中,取第一次掃描中存儲的最小值和新結果:
def space_to_empty_lots(arr: list) -> list:
result = []
# first sweep
lastZero = -len(arr)
for i, value in enumerate(arr):
if value == 0:
lastZero = i
result.append(i - lastZero)
# second sweep
lastZero = len(arr)*2
for i, value in reversed(list(enumerate(arr))):
if value == 0:
lastZero = i
result[i] = min(result[i], lastZero - i)
return result
注意:這個 function 假設輸入列表中至少有一個 0。 目前尚不清楚當沒有 0 時 function 應該做什么。在這種情況下,此實現將返回一個值大於輸入列表長度的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.