pandas
Types de données
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