python - ¿Cómo encontrar el último elemento distinto de cero en cada columna a lo largo del marco de datos?
pandas dataframe (5)
¿Cómo se puede buscar el último elemento que no sea cero en cada columna de un marco de datos?
Entrada
A B
0 0 1
1 0 2
2 9 0
3 10 0
4 0 0
5 0 0
Salida
A B
0 10 2
Algo como:
results = {}
for column in df.columns:
results[column] = df.loc[df[column]!=0, column].iloc[-1]
Esto hará que un diccionario con todas las columnas como claves y que duren valores distintos de cero como valores.
EDITAR: si lo desea en un marco de datos, más la comprensión de dictado para una sola línea:
results = pd.DataFrame({column:[df.loc[df[column]!=0, column].iloc[-1]] for column in df.columns})
Aquí hay un enfoque utilizando
ndarray.argmax
y la indexación avanzada:
first_max = df.values[df.ne(0).values.argmax(0), range(df.shape[1])]
out = pd.DataFrame([first_max], columns=df.columns)
df = pd.DataFrame({''A'': [0,0,0,10,0,0] , ''B'': [0,2,0,0,0,0]})
first_max = df.values[df.ne(0).values.argmax(0), range(df.shape[1])]
# array([10, 2])
pd.DataFrame([first_max], columns=df.columns)
A B
0 10 2
Actualizar
Para encontrar el último no cero:
row_ix = df.shape[0]-df.ne(0).values[::-1].argmax(0)-1
first_max = df.values[row_ix, range(df.shape[1])]
out = pd.DataFrame([first_max], columns=df.columns)
Puede convertir
0
en valores faltantes, usar el relleno hacia adelante y seleccionar la última fila por indexación, la última conversión a entero:
df = df.mask(df==0).ffill().iloc[[-1]].astype(int)
print (df)
A B
5 10 2
Recorra las columnas y luego las filas y almacene la última variable distinta de cero
list = []* number_of_columns
for i in range(len(df)):
dfcolumn = df[:,i]
for item in dfcolumn:
if item != 0:
list[i] = [i, item]
print(list)
Usando
itertools.dropwhile
Dado
import itertools as it
import pandas as pd
df = pd.DataFrame(
{"A": [0, 0, 9, 10, 0, 0],
"B": [1, 2, 0, 0, 0, 0]}
)
Código
#3 2 1
[next(it.dropwhile(lambda x: x == 0, reversed(col))) for _, col in df.iteritems()]
Salida
[10, 2]
Detalles
Con cada columna en el DataFrame, queremos
-
iterar la columna en sentido inverso, por ejemplo,
[0, 0, 10, 9, 0, 0]
-
suelte todos los ceros hasta el primer elemento distinto de cero, por ejemplo,
[10, 9, 0, 0]
-
obtener el siguiente elemento del iterador, por ejemplo,
10