type parse float data column change cast astype python pandas

parse - python pandas cast column to int



pandas: to_numeric para columnas mĂșltiples (4)

Estoy trabajando con el siguiente df :

c.sort_values(''2005'', ascending=False).head(3) GeoName ComponentName IndustryId IndustryClassification Description 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 37926 Alabama Real GDP by state 9 213 Support activities for mining 99 98 117 117 115 87 96 95 103 102 (NA) 37951 Alabama Real GDP by state 34 42 Wholesale trade 9898 10613 10952 11034 11075 9722 9765 9703 9600 9884 10199 37932 Alabama Real GDP by state 15 327 Nonmetallic mineral products manufacturing 980 968 940 1084 861 724 714 701 589 641 (NA)

Quiero forzar numérico en todos los años:

c[''2014''] = pd.to_numeric(c[''2014''], errors=''coerce'')

¿hay una manera fácil de hacer esto o tengo que escribirlas todas?


Otra forma es usar apply , un forro:

cols = [''col1'', ''col2'', ''col3''] data[cols] = data[cols].apply(pd.to_numeric, errors=''coerce'', axis=1)


Puedes usar:

print df.columns[5:] Index([u''2004'', u''2005'', u''2006'', u''2007'', u''2008'', u''2009'', u''2010'', u''2011'', u''2012'', u''2013'', u''2014''], dtype=''object'') for col in df.columns[5:]: df[col] = pd.to_numeric(df[col], errors=''coerce'') print df GeoName ComponentName IndustryId IndustryClassification / 37926 Alabama Real GDP by state 9 213 37951 Alabama Real GDP by state 34 42 37932 Alabama Real GDP by state 15 327 Description 2004 2005 2006 2007 / 37926 Support activities for mining 99 98 117 117 37951 Wholesale trade 9898 10613 10952 11034 37932 Nonmetallic mineral products manufacturing 980 968 940 1084 2008 2009 2010 2011 2012 2013 2014 37926 115 87 96 95 103 102 NaN 37951 11075 9722 9765 9703 9600 9884 10199.0 37932 861 724 714 701 589 641 NaN

Otra solución con filter :

print df.filter(like=''20'') 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 37926 99 98 117 117 115 87 96 95 103 102 (NA) 37951 9898 10613 10952 11034 11075 9722 9765 9703 9600 9884 10199 37932 980 968 940 1084 861 724 714 701 589 641 (NA) for col in df.filter(like=''20'').columns: df[col] = pd.to_numeric(df[col], errors=''coerce'') print df GeoName ComponentName IndustryId IndustryClassification / 37926 Alabama Real GDP by state 9 213 37951 Alabama Real GDP by state 34 42 37932 Alabama Real GDP by state 15 327 Description 2004 2005 2006 2007 / 37926 Support activities for mining 99 98 117 117 37951 Wholesale trade 9898 10613 10952 11034 37932 Nonmetallic mineral products manufacturing 980 968 940 1084 2008 2009 2010 2011 2012 2013 2014 37926 115 87 96 95 103 102 NaN 37951 11075 9722 9765 9703 9600 9884 10199.0 37932 861 724 714 701 589 641 NaN


Si está buscando un rango de columnas, puede intentar esto:

df.iloc[7:] = df.iloc[7:].astype(float)

Los ejemplos anteriores convertirán el tipo a flotante, ya que todas las columnas comienzan desde la 7 hasta el final. Usted, por supuesto, puede utilizar diferentes tipos o diferentes rangos.

Creo que esto es útil cuando tienes un gran rango de columnas para convertir y muchas filas. No te hace pasar cada fila por tu cuenta, creo que lo haré más eficientemente.

Esto es útil solo si sabe que todas las columnas requeridas solo contienen números; no cambiará los "valores incorrectos" (como la cadena) para que sea NaN para usted.


ACTUALIZACIÓN: no necesita convertir sus valores después, puede hacerlo sobre la marcha al leer su CSV:

In [165]: df=pd.read_csv(url, index_col=0, na_values=[''(NA)'']).fillna(0) In [166]: df.dtypes Out[166]: GeoName object ComponentName object IndustryId int64 IndustryClassification object Description object 2004 int64 2005 int64 2006 int64 2007 int64 2008 int64 2009 int64 2010 int64 2011 int64 2012 int64 2013 int64 2014 float64 dtype: object

Si necesita convertir varias columnas a tipos de datos numéricos, use la siguiente técnica:

Fuente de muestra DF:

In [271]: df Out[271]: id a b c d e f 0 id_3 AAA 6 3 5 8 1 1 id_9 3 7 5 7 3 BBB 2 id_7 4 2 3 5 4 2 3 id_0 7 3 5 7 9 4 4 id_0 2 4 6 4 0 2 In [272]: df.dtypes Out[272]: id object a object b int64 c int64 d int64 e int64 f object dtype: object

Convertir columnas seleccionadas a tipos numéricos:

In [273]: cols = df.columns.drop(''id'') In [274]: df[cols] = df[cols].apply(pd.to_numeric, errors=''coerce'') In [275]: df Out[275]: id a b c d e f 0 id_3 NaN 6 3 5 8 1.0 1 id_9 3.0 7 5 7 3 NaN 2 id_7 4.0 2 3 5 4 2.0 3 id_0 7.0 3 5 7 9 4.0 4 id_0 2.0 4 6 4 0 2.0 In [276]: df.dtypes Out[276]: id object a float64 b int64 c int64 d int64 e int64 f float64 dtype: object

PD: si desea seleccionar todas string columnas de string ( object ) use el siguiente truco simple:

cols = df.columns[df.dtypes.eq(''object'')]