type float convertir convert change astype python pandas

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