Buscar..


Observaciones

Los tipos no son nativos de los pandas. Son el resultado de pandas cerca del acoplamiento arquitectónico para adormecer.

el dtype de una columna no tiene que correlacionarse de ninguna manera con el tipo python del objeto contenido en la columna.

Aquí tenemos un pd.Series . pd.Series con flotadores. El dtype será float .

Luego usamos astype para " astype " a objeto.

pd.Series([1.,2.,3.,4.,5.]).astype(object)
0    1
1    2
2    3
3    4
4    5
dtype: object

El dtype ahora es objeto, pero los objetos en la lista todavía son flotantes. Lógico si sabes que en Python, todo es un objeto, y se puede actualizar al objeto.

type(pd.Series([1.,2.,3.,4.,5.]).astype(object)[0])
float

Aquí intentamos "echar" las carrozas a las cuerdas.

pd.Series([1.,2.,3.,4.,5.]).astype(str)
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
dtype: object

El dtype ahora es objeto, pero el tipo de las entradas en la lista es cadena. Esto se debe a que numpy no se ocupa de las cadenas y, por lo tanto, actúa como si solo fueran objetos y no preocupa.

type(pd.Series([1.,2.,3.,4.,5.]).astype(str)[0])
str

No confíe en los tipos, son un artefacto de un defecto arquitectónico en los pandas. Especifíquelos como debe, pero no confíe en el tipo de dtype establecido en una columna.

Comprobando los tipos de columnas

Los tipos de columnas se pueden verificar mediante .dtypes atrribute of DataFrames.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': [True, False, True]})

In [2]: df
Out[2]:
   A    B      C
0  1  1.0   True
1  2  2.0  False
2  3  3.0   True

In [3]: df.dtypes
Out[3]:
A      int64
B    float64
C       bool
dtype: object

Para una sola serie, puede usar el atributo .dtype .

In [4]: df['A'].dtype
Out[4]: dtype('int64')

Cambiando dtypes

astype() método astype() cambia el tipo de letra de una serie y devuelve una nueva serie.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 
                           'C': ['1.1.2010', '2.1.2011', '3.1.2011'], 
                           'D': ['1 days', '2 days', '3 days'],
                           'E': ['1', '2', '3']})
In [2]: df
Out[2]:
   A    B          C       D  E
0  1  1.0   1.1.2010  1 days  1
1  2  2.0   2.1.2011  2 days  2
2  3  3.0   3.1.2011  3 days  3

In [3]: df.dtypes
Out[3]:
A      int64
B    float64
C     object
D     object
E     object
dtype: object

Cambie el tipo de columna A a flotante y el tipo de columna B a entero:

In [4]: df['A'].astype('float')
Out[4]:
0    1.0
1    2.0
2    3.0
Name: A, dtype: float64

In [5]: df['B'].astype('int')
Out[5]:
0    1
1    2
2    3
Name: B, dtype: int32

astype() método astype() es para conversión de tipo específico (es decir, puede especificar .astype(float64') , .astype(float32) o .astype(float16) ). Para la conversión general, puede usar pd.to_numeric , pd.to_datetime y pd.to_timedelta .

Cambiando el tipo a numérico

pd.to_numeric cambia los valores a un tipo numérico.

In [6]: pd.to_numeric(df['E'])
Out[6]:
0    1
1    2
2    3
Name: E, dtype: int64

De forma predeterminada, pd.to_numeric genera un error si una entrada no se puede convertir en un número. Puedes cambiar ese comportamiento usando el parámetro de errors .

# Ignore the error, return the original input if it cannot be converted
In [7]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='ignore')
Out[7]:
0    1
1    2
2    a
dtype: object

# Return NaN when the input cannot be converted to a number
In [8]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='coerce')
Out[8]:
0    1.0
1    2.0
2    NaN
dtype: float64

Si es necesario, compruebe que todas las filas con entrada no se pueden convertir a boolean indexing uso numérico con isnull :

In [9]: df = pd.DataFrame({'A': [1, 'x', 'z'],
                           'B': [1.0, 2.0, 3.0],
                           'C': [True, False, True]})

In [10]: pd.to_numeric(df.A, errors='coerce').isnull()
Out[10]: 
0    False
1     True
2     True
Name: A, dtype: bool

In [11]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[11]: 
   A    B      C
1  x  2.0  False
2  z  3.0   True

Cambiando el tipo a datetime

In [12]: pd.to_datetime(df['C'])
Out[12]:
0   2010-01-01
1   2011-02-01
2   2011-03-01
Name: C, dtype: datetime64[ns]

Tenga en cuenta que 2.1.2011 se convierte al 1 de febrero de 2011. Si desea el 2 de enero de 2011, debe utilizar el parámetro dayfirst .

In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')

Cambiando el tipo a timedelta

In [14]: pd.to_timedelta(df['D'])
Out[14]:
0   1 days
1   2 days
2   3 days
Name: D, dtype: timedelta64[ns]

Seleccionando columnas basadas en dtype

select_dtypes método select_dtypes se puede utilizar para seleccionar columnas basadas en dtype.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'], 
                           'D': [True, False, True]})

In [2]: df
Out[2]: 
   A    B  C      D
0  1  1.0  a   True
1  2  2.0  b  False
2  3  3.0  c   True

Con los parámetros de include y exclude , puede especificar qué tipos desea:

# Select numbers
In [3]: df.select_dtypes(include=['number'])  # You need to use a list
Out[3]:
   A    B
0  1  1.0
1  2  2.0
2  3  3.0    

# Select numbers and booleans
In [4]: df.select_dtypes(include=['number', 'bool'])
Out[4]:
   A    B      D
0  1  1.0   True
1  2  2.0  False
2  3  3.0   True

# Select numbers and booleans but exclude int64
In [5]: df.select_dtypes(include=['number', 'bool'], exclude=['int64'])
Out[5]:
     B      D
0  1.0   True
1  2.0  False
2  3.0   True

Resumiendo dtypes

get_dtype_counts método get_dtype_counts se puede usar para ver un desglose de los tipos.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'], 
                           'D': [True, False, True]})

In [2]: df.get_dtype_counts()
Out[2]: 
bool       1
float64    1
int64      1
object     1
dtype: int64


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow