Eu tenho um pandas
dataframe com 2 colunas (longitude e latitude) ordenadas em ordem decrescente com base na primeira coluna.
Gostaria de preencher um numpy
array com os elementos do dataframe quando o elemento da segunda coluna for maior que o último elemento do próprio array.
Eu escrevi este código:
coords_array = df.sort_values("lon", ascending=False).to_numpy()
new_array = np.array([coords_array[0]])
for coords in coords_array [1:]:
if coords[1] > new_array[-1][1]:
new_array = np.vstack([new_array, coords])
esse código faz o que eu quero, mas gostaria de torná-lo mais numpy
amigável e evitar o for
loop. Isso também é para eu ficar mais confiante numpy
.
Eu estava tentando np.apply_along_axis
combinar com lambda
function e walrus operator :=
, isso porque o último elemento de new_array
pode mudar, não é fixo, então algo assim:
new_array = np.array([coords_array[0]])
np.apply_along_axis(lambda x: (new_array := np.vstack([new_array, coords])) if x[1] > new_array[-1][1] else _, 1, coords_array[1:])
mas isso me dá o erro:
UnboundLocalError: local variable 'new_array' referenced before assignment
considera new_array
como variável local; Acho que estou entendendo mal o operador da morsa...
Alguma sugestão de como posso remover o for
loop?
Estou interessado em entender por que meu código não funciona, mas fico feliz com qualquer outra sugestão.
Atualizar
Este é um exemplo mínimo.
Se o DataFrame for:
df = pd.DataFrame({"lon": [4, 2, 1, 6, 4, 5, 2], "lat": [3, 2, 3, 2, 2, 1, 6]})
coords_array
é obtido ordenando df
com base em "lon"
valores:
coords_array
array([[6, 2],
[5, 1],
[4, 3],
[4, 2],
[2, 2],
[2, 6],
[1, 3]], dtype=int64)
A primeira coluna de coords_array
is "lon"
e a segunda é "lat"
.
new_array
é inicializado com o primeiro elemento de coords_array
e os outros são adicionados com o loop somente se coords_array
"lat"
for maior que o "lat"
do new_array
último elemento.
Então new_array
é:
new_array
array([[6, 2],
[4, 3],
[2, 6]], dtype=int64)
Que tal:
Aqui está um método pandas: