python pandas dataframe

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

  1. iterar la columna en sentido inverso, por ejemplo, [0, 0, 10, 9, 0, 0]
  2. suelte todos los ceros hasta el primer elemento distinto de cero, por ejemplo, [10, 9, 0, 0]
  3. obtener el siguiente elemento del iterador, por ejemplo, 10