Hola, tengo el marco de datos de Pandas que se ve así:

      0            1    2         3            4     5     6
150  NaN          NaN  NaN       NaN   March 1980   NaN   NaN
151  NaN          NaN  NaN       NaN    June 1990   NaN   NaN
152  NaN          NaN  NaN  Sep 2015          NaN   NaN   NaN
153  NaN          NaN  NaN  Jan 1972          NaN   NaN   NaN
154  NaN          NaN  NaN  Mar 1974          NaN   NaN   NaN

No puedo usar dropna (), porque tendré un marco de datos vacío.

Todas las columnas tienen un dato en una columna, ¿hay alguna forma de transformarlo en una columna DataFrame?

         0           
150  March 1980
151  June 1990
152  Sep 2015
153  Jan 1972
154  Mar 1974

Gracias.

0
Guillermo Izquierdo 30 oct. 2017 a las 05:55

3 respuestas

La mejor respuesta

Tratar

df = df.fillna('').sum(1)

O

df = df.fillna('').apply(''.join, axis = 1)

Usted consigue

150    March 1980
151     June 1990
152      Sep 2015
153      Jan 1972
154      Mar 1974
dtype: object
4
Vaishali 30 oct. 2017 a las 03:08

Es esto lo que quieres ?

df.apply(lambda x : sorted(x,key=pd.isnull),axis=1).dropna(1)
Out[1052]: 
             0
150  March1980
151   June1990
152    Sep2015
153    Jan1972
154    Mar1974

O

df.bfill(1).iloc[:,0]
Out[1056]: 
150    March1980
151     June1990
152      Sep2015
153      Jan1972
154      Mar1974
Name: 0, dtype: object

O

df.stack()
Out[1058]: 
150  4    March1980
151  4     June1990
152  3      Sep2015
153  3      Jan1972
154  3      Mar1974
dtype: object
3
YOBEN_S 30 oct. 2017 a las 03:13

Otra solución es con la ayuda de la máscara booleana y pd.notnull, que es mucho más rápido que sum y sorted es decir

sdf = pd.DataFrame(df.values[pd.notnull(df)],index=df.index)

Salida:

            0
150  March1980
151   June1990
152    Sep2015
153    Jan1972
154    Mar1974
ndf = pd.concat([df.reset_index(drop=True)]*1000)

%%timeit
ndf.apply(lambda x : sorted(x,key=pd.isnull),axis=1).dropna(1)
1 loop, best of 3: 1.29 s per loop

%%timeit
ndf.bfill(1).iloc[:,0]
1 loop, best of 3: 773 ms per loop

%%timeit
ndf.fillna('').sum(1)
10 loops, best of 3: 26.4 ms per loop

%%timeit
pd.DataFrame(ndf.values[pd.notnull(ndf)],index=ndf.index)
100 loops, best of 3: 3.11 ms per loop
1
Bharath 30 oct. 2017 a las 03:53