Pandas: Convertir a numérico, creando NaNs cuando sea necesario

Digamos que tengo una columna en un dataframe que tiene algunos números y algunos que no son 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 hacer que todo lo que no sea flotante la convierta a NaN ?

Cuando bash

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

o

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

Obtengo ValueError: could not convert string to float: -

En pandas 0.17.0 convert_objects genera una advertencia:

FutureWarning: 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ía usar el método pd.to_numeric y aplicarlo para el dataframe con coacción de arg.

 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 pandas> = 0.17.0 , de los documentos que hay de nuevo en pandas 0.17.0 :

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

Utilice el método de la serie convert_objects (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 un método DataFrame.

Primero reemplace todos los valores de cadena con None , para marcarlos como valores faltantes y luego conviértalos a flotar.

 df['foo'][df['foo'] == '-'] = None df['foo'] = df['foo'].astype(float) 

Simplemente puede usar pd.to_numeric y configurar el error para coerce sin usar apply

 df['foo'] = pd.to_numeric(df['foo'], errors='coerce')