Tengo un marco de datos como este:

           2017      2018      2012  2015  2014  2016
11647  0.044795  0.000000  0.000000   0.0   0.0   0.0
16389  0.089801  0.044900  0.000000   0.0   0.0   0.0
16404  0.014323  0.000000  0.000000   0.0   0.04   0.0
16407  0.052479  0.010442  0.009277   0.0   0.0   0.0
16409  0.000000  0.000000  0.004883   0.0   0.0   5.0

Tenga en cuenta que las columnas no están ordenadas. Para cada fila, necesito obtener el último año con un valor distinto de cero. Entonces el resultado esperado es:

11647    2017
16389    2018
16404    2017
16407    2018
16409    2016

¿Como hacer eso?

0
Dennis Golomazov 7 sep. 2018 a las 19:51

3 respuestas

La mejor respuesta

Puede usar idxmax en una columna ordenada df

df[sorted(df.columns, reverse=True)].ne(0).idxmax(1)

11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
dtype: object
2
rafaelc 7 sep. 2018 a las 16:58
df.apply(lambda row: row[row > 0].index.max(), axis=1)

Da el resultado esperado.

0
Dennis Golomazov 7 sep. 2018 a las 16:51

Usando stack con max

df[df.ne(0)].stack().reset_index(level=1)['level_1'].max(level=0)
Out[386]: 
11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
Name: level_1, dtype: int64

Solo actualiza

df.ne(0).mul(df.columns).max(1)
Out[423]: 
11647    2017.0
16389    2018.0
16404    2017.0
16407    2018.0
16409    2016.0
dtype: float64
1
YOBEN_S 7 sep. 2018 a las 21:16