Pandas: conversión a numérico, creación de NaN cuando sea necesario

Resuelto Amelio Vazquez-Reina asked hace 11 años • 4 respuestas

Digamos que tengo una columna en un marco de datos que tiene algunos números y otros no números.

>> df['foo']
0       0.0
1     103.8
2     751.1
3       0.0
4       0.0
5         -
6         -
7       0.0
8         -
9       0.0
Name: foo, Length: 9, dtype: object

¿Cómo puedo convertir esta columna a np.float, y convertir todo lo demás que no sea flotante a NaN?

Cuando lo intento:

>> df['foo'].astype(np.float)

o

>> df['foo'].apply(np.float)

yo obtengoValueError: could not convert string to float: -

Amelio Vazquez-Reina avatar Aug 26 '13 05:08 Amelio Vazquez-Reina
Aceptado

En pandas 0.17.0 convert_objectssurge una advertencia:

Advertencia futura: convert_objects está en desuso. Utilice los convertidores específicos de tipo de datos pd.to_datetime, pd.to_timedelta y pd.to_numeric.

Podrías usar pd.to_numericel método y aplicarlo para el marco de datos con arg coerce.

df1 = df.apply(pd.to_numeric, args=('coerce',))

o tal vez más apropiadamente:

df1 = df.apply(pd.to_numeric, errors='coerce')

EDITAR

El método anterior solo es válido para la versión de pandas >= 0.17.0, de los documentos de novedades de pandas 0.17.0 :

pd.to_numeric es una nueva función para convertir cadenas en números (posiblemente con coerción) (GH11133)

Anton Protopopov avatar Nov 19 '2015 05:11 Anton Protopopov

Utilice el convert_objectsmétodo Serie (y convert_numeric):

In [11]: s
Out[11]: 
0    103.8
1    751.1
2      0.0
3      0.0
4        -
5        -
6      0.0
7        -
8      0.0
dtype: object

In [12]: s.convert_objects(convert_numeric=True)
Out[12]: 
0    103.8
1    751.1
2      0.0
3      0.0
4      NaN
5      NaN
6      0.0
7      NaN
8      0.0
dtype: float64

Nota: esto también está disponible como método DataFrame.

Andy Hayden avatar Aug 25 '2013 22:08 Andy Hayden

Simplemente puede usar pd.to_numericy configurar el error coercesin usarapply

df['foo'] = pd.to_numeric(df['foo'], errors='coerce')
Amir Imani avatar Nov 28 '2017 23:11 Amir Imani