Recherche…


Remarques

Les types ne sont pas natifs des pandas. Ils sont le résultat d'un couplage architectural étroit entre pandas et numpy.

le type d'une colonne ne doit en aucun cas être lié au type python de l'objet contenu dans la colonne.

Nous avons ici un pd.Series avec des flottants. Le type sera float .

Ensuite, nous utilisons astype pour le "lancer" pour objecter.

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

Le type dt est maintenant objet, mais les objets de la liste sont toujours flottants. Logique si vous savez que dans Python, tout est un objet, et peut être mis à jour pour objecter.

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

Ici, nous essayons de "lancer" les flotteurs en chaînes.

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

Le type dt est maintenant objet, mais le type des entrées dans la liste est chaîne. C'est parce que numpy ne traite pas des chaînes, et agit donc comme si elles n'étaient que des objets et sans aucun souci.

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

Ne faites pas confiance aux types, ils sont un artefact d'un défaut architectural des pandas. Spécifiez-les comme vous devez, mais ne vous fiez pas à quel type est défini sur une colonne.

Vérification des types de colonnes

Les types de colonnes peuvent être vérifiés par .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

Pour une seule série, vous pouvez utiliser l'attribut .dtype .

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

Changer de type

astype() méthode astype() modifie le type d'une série et renvoie une nouvelle série.

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

Changez le type de la colonne A pour flotter et tapez la colonne B en entier:

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éthode astype() est destinée à la conversion de types spécifiques (c.-à-d. que vous pouvez spécifier .astype(float64') , .astype(float32) ou .astype(float16) ). Pour la conversion générale, vous pouvez utiliser pd.to_numeric , pd.to_datetime et pd.to_timedelta .

Changer le type en numérique

pd.to_numeric change les valeurs en un type numérique.

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

Par défaut, pd.to_numeric une erreur si une entrée ne peut pas être convertie en nombre. Vous pouvez modifier ce comportement en utilisant le paramètre 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 nécessaire, vérifiez que toutes les lignes avec entrée ne peuvent pas être converties en boolean indexing numérique avec l' boolean indexing avec 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

Changer le type en 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]

Notez que le 2.1.2011 est converti au 1er février 2011. Si vous souhaitez utiliser le 2 janvier 2011, vous devez utiliser le paramètre dayfirst .

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

Changer le type en timedelta

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

Sélection de colonnes basées sur dtype

select_dtypes méthode select_dtypes peut être utilisée pour sélectionner des colonnes basées sur 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

Avec exclude paramètres include et exclude , vous pouvez spécifier les types souhaités:

# 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

Résumé des types

get_dtype_counts méthode get_dtype_counts peut être utilisée pour voir une décomposition des types de données.

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow