Pandas: conversión a numérico, creación de NaN cuando sea necesario
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: -
En pandas 0.17.0
convert_objects
surge 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_numeric
el 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)
Utilice el convert_objects
mé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.
Simplemente puede usar pd.to_numeric
y configurar el error coerce
sin usarapply
df['foo'] = pd.to_numeric(df['foo'], errors='coerce')