convertir - object to float python
Convierte pandas.Series del objeto dtype a float, y los errores a nans (2)
A partir de v0.17, convert_objects
está en desuso.
Para convertir una serie a numérica, use pd.to_numeric
con el argumento errors=''coerce''
.
# Setup.
s = pd.Series([''1'',''2'',''3'',''4'',''.''])
s
0 1
1 2
2 3
3 4
4 .
dtype: object
pd.to_numeric(s, errors=''coerce'')
0 1.0
1 2.0
2 3.0
3 4.0
4 NaN
dtype: float64
Si necesita completar los NaN
, use Series.fillna
.
pd.to_numeric(s, errors=''coerce'').fillna(0, downcast=''infer'')
0 1
1 2
2 3
3 4
4 0
dtype: float64
Tenga en cuenta que downcast=''infer''
intentará bajar los flotantes a enteros siempre que sea posible. Quita el argumento si no quieres eso.
Extensión para DataFrames
Si necesita extender esto a DataFrames, deberá aplicarlo a cada fila. Puede hacerlo utilizando DataFrame.apply
.
# Setup.
np.random.seed(0)
df = pd.DataFrame({
''A'' : np.random.choice(10, 5),
''C'' : np.random.choice(10, 5),
''B'' : [''1'', ''###'', ''...'', 50, ''234''],
''D'' : [''23'', ''1'', ''...'', ''268'', ''$$'']}
)[list(''ABCD'')]
df
A B C D
0 5 1 9 23
1 0 ### 3 1
2 3 ... 5 ...
3 3 50 2 268
4 7 234 4 $$
df.dtypes
A int64
B object
C int64
D object
dtype: object
df.apply(pd.to_numeric, errors=''coerce'')
A B C D
0 5 1.0 9 23.0
1 0 NaN 3 1.0
2 3 NaN 5 NaN
3 3 50.0 2 268.0
4 7 234.0 4 NaN
df.apply(pd.to_numeric, errors=''coerce'').dtypes
A int64
B float64
C int64
D float64
dtype: object
También puedes hacer esto con DataFrame.transform
; aunque mis pruebas indican que esto es ligeramente más lento:
df.transform(pd.to_numeric, errors=''coerce'')
A B C D
0 5 1.0 9 23.0
1 0 NaN 3 1.0
2 3 NaN 5 NaN
3 3 50.0 2 268.0
4 7 234.0 4 NaN
Si tiene muchas columnas (numéricas; no numéricas), puede hacer que esto sea un poco más pd.to_numeric
aplicando pd.to_numeric
en las columnas no numéricas.
df.dtypes.eq(object)
A False
B True
C False
D True
dtype: bool
cols = df.columns[df.dtypes.eq(object)]
# Actually, `cols` can be any list of columns you need to convert.
cols
# Index([''B'', ''D''], dtype=''object'')
df[cols] = df[cols].apply(pd.to_numeric, errors=''coerce'')
# Alternatively,
# for c in cols:
# df[c] = pd.to_numeric(df[c], errors=''coerce'')
df
A B C D
0 5 1.0 9 23.0
1 0 NaN 3 1.0
2 3 NaN 5 NaN
3 3 50.0 2 268.0
4 7 234.0 4 NaN
La aplicación de pd.to_numeric
largo de las columnas (es decir, axis=0
, el valor predeterminado) debe ser un poco más rápida para los DataFrames largos.
Considere la siguiente situación:
In [2]: a = pd.Series([1,2,3,4,''.''])
In [3]: a
Out[3]:
0 1
1 2
2 3
3 4
4 .
dtype: object
In [8]: a.astype(''float64'', raise_on_error = False)
Out[8]:
0 1
1 2
2 3
3 4
4 .
dtype: object
Hubiera esperado una opción que permitiera la conversión al convertir valores erróneos (como eso) a NaN
s. ¿Hay una manera de lograr esto?
In [30]: pd.Series([1,2,3,4,''.'']).convert_objects(convert_numeric=True)
Out[30]:
0 1
1 2
2 3
3 4
4 NaN
dtype: float64