Fonction df.astype() de Pandas
df.astype()Il s'agit d'une fonction de Pandas permettant de convertir les types de données d'un DataFrame ou d'une Series.
Lors du traitement des données, des types de données incompatibles sont un problème courant. Par exemple, des nombres stockés sous forme de chaînes, des dates stockées sous forme de texte, etc.astype()Il permet de convertir explicitement les données vers le type requis, tel que entier, flottant, chaîne, date, etc., garantissant que les données peuvent être correctement calculées et analysées.
Syntaxe de base et paramètres
astype()Il s'agit à la fois d'une fonction membre de DataFrame et d'une fonction membre de Series, invoquée via l'opérateur point.pour appeler.
Format de syntaxe
DataFrame.astype(dtype, copy=True, errors='raise') Series.astype(dtype, copy=True, errors='raise')
Description du paramètre
| Paramètre | Type | Obligatoire ? | Description | Valeur par défaut |
|---|---|---|---|---|
| dtype | dtype Python ou dtype numpy | Requis | Type de données cible. Il peut s'agir d'un type Python (par ex.,int、str), d'un type NumPy (par ex.,np.int64、np.float32), ou d'un type Pandas (par ex.,'int64'、'float64'、'category')。 |
Aucune |
| copy | bool | Optional | S'il estTrue, renvoie toujours un nouvel objet ; s'il estFalse, modifie l'objet d'origine lorsque c'est possible. |
True |
| errors | str | Optional | Contrôle la gestion des erreurs.'raise'Indique qu'une exception est levée lorsque la conversion échoue ;'ignore'Indique que les données d'origine sont renvoyées lorsque la conversion échoue, sans lever d'exception. |
'raise' |
Description de la valeur de retour
- Renvoie un nouveau DataFrame ou une Series où les types de données de toutes les colonnes spécifiées ont été convertis vers le type cible.
Exemples
Maîtrisons à fond à travers une série d'exemplesastype()l'utilisation de.
Exemple 1 : Convertir le type de données d'une seule colonne
Convertir une colonne d'une Series ou d'un DataFrame vers le type spécifié.
Exemple
# Créer un DataFrame où les valeurs sont stockées sous forme de chaînes de caractères
data = {
'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu'],
'age': ['25', '30', '35', '28'], # Stocker sous forme de chaîne de caractères
'Salary': ['5000', '6000', '5500', '7000'] # Stocker sous forme de chaîne de caractères
}
df = pd.DataFrame(data)
print("Type de données d'origine :")
print(df.dtypes)
print("=" * 50)
# Convertir la colonne "Age" en type entier
df['age'] = df['age'].astype(int)
print(Type de données de la colonne age après conversion :)
print(df.dtypes)
print("=" * 50)
# Convertir la colonne 'Salary' en type float
df['Salary'] = df['Salary'].astype(float)
print(Type de données de la colonne salaire après conversion :)
print(df.dtypes)
print("=" * 50)
print("Données converties :")
print(df)
Sortie attendue :
原始数据类型:
姓名 object
年龄 object # 字符串类型
薪资 object # 字符串类型
==================================================
转换年龄列后的数据类型:
姓名 object
年龄 int64 # 整数类型
薪资 object
==================================================
转换薪资列后的数据类型:
姓名 object
年龄 int64
薪资 float64 # 浮点数类型
==================================================
转换后的数据:
姓名 年龄 薪资
0 张三 25 5000.0
1 李四 30 6000.0
2 王五 35 5500.0
3 赵六 28 7000.0
Explication du code :
- Dans les données d'origine, 'age' et 'salary' sont tous deux de type chaîne (
object)。 - Utiliser
df['列名'].astype(int)pour convertir les chaînes en entiers. - Après conversion, des calculs numériques peuvent être effectués, tels que la somme, la moyenne, etc.
Exemple 2 : Convertir les types de données d'un DataFrame entier
Vous pouvez spécifier les types de données pour l'ensemble du DataFrame en une seule fois.
Exemple
# Créer un DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [1.5, 2.5, 3.5, 4.5],
'C': ['a', 'b', 'c', 'd']
}
df = pd.DataFrame(data)
print("Type de données d'origine :")
print(df.dtypes)
print("=" * 50)
# Convertir la colonne A en float64 et la colonne B en int64
df_converted = df.astype({'A': 'float64', 'B': 'int64'})
print(Types de données convertis :)
print(df_converted.dtypes)
print("=" * 50)
print("Données converties :")
print(df_converted)
Sortie attendue :
原始数据类型:
A int64
B float64
C object
==================================================
转换后的数据类型:
A float64
B int64 # 小数部分被截断
C object
==================================================
转换后的数据:
A B C
0 1.0 2 a
1 2.0 2 b
2 3.0 3 c
3 4.0 4 d
Explication du code :
- Utilisez un dictionnaire
{'Column Name': 'Type'}Vous pouvez spécifier les types de conversion de plusieurs colonnes en même temps. - Lors de la conversion des valeurs float de la colonne B en entiers, la partie décimale est tronquée (2.5 devient 2).
Exemple 3 : Convertir en type de données catégoriel
Type de données catégoriel (category) peut économiser de la mémoire, particulièrement adapté aux colonnes avec un nombre limité de valeurs.
Exemple
# Créer un DataFrame avec de nombreuses valeurs dupliquées
data = {
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Pékin', 'Shanghai', 'Canton', 'Shenzhen'] * 1000,
Number: range(8000)
}
df = pd.DataFrame(data)
print("Type de données d'origine :")
print(df.dtypes)
print(fUtilisation de la mémoire : {df.memory_usage(deep=True).sum() / 1024:.2f} KB)
print("=" * 50)
# Convertir la colonne "City" en type catégoriel
df['city'] = df['city'].astype('category')
print(Types de données convertis :)
print(df.dtypes)
print(fUtilisation de la mémoire : {df.memory_usage(deep=True).sum() / 1024:.2f} KB)
Sortie attendue :
原始数据类型: 城市 object 编号 int64 内存使用: ~456 KB ================================================== 转换后的数据类型: 城市 category 编号 int64 内存使用: ~120 KB # 内存使用大幅减少
Explication du code :
- Le type de données catégoriel attribue un identifiant entier à chaque valeur unique, ce qui permet d'économiser beaucoup de mémoire par rapport au stockage de chaînes complètes.
- Les données d'origine comportent 8000 lignes et utilisent environ 456 KB de mémoire ; après conversion, elles en utilisent environ 120 KB, ce qui permet d'économiser environ 75% de mémoire.
- Cette méthode est particulièrement adaptée aux variables catégorielles comportant peu de valeurs.
Exemple 4 : Convertir en type Datetime
Convertir les chaînes en type datetime afin que des opérations liées aux dates puissent être effectuées.
Exemple
# Créer un DataFrame avec des chaînes de date
data = {
Date: ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'Sales': [100, 150, 120, 180]
}
df = pd.DataFrame(data)
print("Type de données d'origine :")
print(df.dtypes)
print("=" * 50)
# Convertir la colonne "date" en type datetime
df[Date] = pd.to_datetime(df[Date])
print(Types de données convertis :)
print(df.dtypes)
print("=" * 50)
print("Données converties :")
print(df)
# Vous pouvez maintenant effectuer des opérations liées aux dates
print(nExtraire le mois :)
print(df[Date].dt.month)
Sortie attendue :
原始数据类型:
日期 object # 字符串类型
销量 int64
==================================================
转换后的数据类型:
日期 datetime64[ns] # 日期时间类型
销量 int64
==================================================
转换后的数据:
日期 销量
0 2024-01-01 100
1 2024-01-02 150
2 2024-01-03 120
3 2024-01-04 180
提取月份:
0 1
1 1
2 1
3 1
Name: 日期, dtype: int64
Explication du code :
- Utiliser
pd.to_datetime()pour convertir les chaînes en type datetime. - Après la conversion, vous pouvez utiliser
.dtaccesseur pour effectuer des opérations sur les dates, comme extraire le mois, le jour de la semaine, etc. - Remarque : bien que vous puissiez aussi utiliser
astype('datetime64[ns]'), maispd.to_datetime()est plus puissant et plus flexible.
Exemple 5 : Gestion des erreurs de conversion
Utilisererrors='ignore'paramètre pour gérer les échecs de conversion.
Exemple
# Créer une Series contenant des valeurs qui ne peuvent pas être converties en entiers
s = pd.Series(['1', '2', 'hello', '4', 'world'])
print(“Données brutes :”)
print(s)
print("=" * 50)
# Essayer la conversion. L'utilisation de errors='raise' (par défaut) lèvera une exception.
try:
s_converted = s.astype(int)
except ValueError as e:
print(fÉchec de la conversion : {e})
print("=" * 50)
# Utiliser errors='ignore', renvoyer les données d'origine lorsque la conversion échoue
s_converted = s.astype(int, errors='ignore')
print("Données converties en utilisant errors='ignore' :")
print(s_converted)
print("=" * 50)
# Utiliser errors='coerce' pour remplir avec NaN lorsque la conversion échoue
s_converted2 = s.astype(float, errors='coerce')
print("Données converties en utilisant errors='coerce' :")
print(s_converted2)
Sortie attendue :
原始数据: 0 1 1 2 2 hello # 无法转换为整数 3 4 4 world # 无法转换为整数 ================================================== 转换失败: invalid literal for int() with base 10: 'hello' ================================================== 使用 errors='ignore' 转换后的数据: 0 1 1 2 2 hello # 保持原值 3 4 4 world # 保持原值 ================================================== 使用 errors='coerce' 转换后的数据: 0 1.0 1 2.0 2 NaN # 无法转换,设为 NaN 3 4.0 4 NaN # 无法转换,设为 NaN
Explication du code :
- Lorsqu'une chaîne contient une valeur qui ne peut pas être convertie en nombre, par défaut, elle lève
ValueErrorune exception. errors='ignore'conservera les données d'origine inchangées.errors='coerce'définira la valeur non convertible àNaN, qui est une méthode courante pour traiter les données sales.
Exemple 6 : Convertir en type booléen
Convertir les données en type booléen, couramment utilisé dans le filtrage conditionnel et les opérations logiques.
Exemple
# Créer un DataFrame contenant 0 et 1
data = {
'Is Member': [0, 1, 1, 0, 1],
'Is Active': ['Oui', 'Non', 'Oui', 'Oui', 'Non']
}
df = pd.DataFrame(data)
print("Données brutes :")
print(df)
print("Types de données brutes :")
print(df.dtypes)
print("=" * 50)
# Convertir 0/1 en type booléen
df['Is Member'] = df['Is Member'].astype(bool)
print("Types de données après conversion de la colonne Is Member :")
print(df.dtypes)
print(df)
print("=" * 50)
# Convertir "Yes"/"No" en type booléen
df['Is Active'] = df['Is Active'].map({'Yes': True, 'No': False})
print("Données après conversion de la colonne Is Active :")
print(df)
print(df.dtypes)
Résultats d'exécution attendus :
原始数据: 是否会员 是否激活 0 0 是 1 1 否 2 1 是 3 0 是 4 1 否 ================================================== 转换是否会员列后的数据类型: 是否会员 bool 是否激活 object ================================================== 转换是否激活列后的数据: 是否会员 是否激活 0 True True 1 True False 2 True True 3 False True 4 True False
Analyse du code :
- 0 peut être converti en
False, 1 converti enTrue。 - Pour les chaînes comme "Yes"/"No", vous devez utiliser
map()pour convertir. - Après conversion, l'indexation booléenne peut être utilisée pour un filtrage rapide.
Notes
astype()Par défaut, un nouvel objet est renvoyé et les données d'origine ne sont pas modifiées. Si vous souhaitez modifier en place, vous pouvez utilisercopy=Falseparamètre, mais cela peut affecter les données d'origine.- Lors de la conversion de nombres à virgule flottante en entiers, la partie décimale est tronquée, et non arrondie.
- Lors de la conversion de chaînes de caractères en nombres, assurez-vous que la chaîne est dans un format numérique valide, sinon une exception sera levée.
- Utilisation
errors='coerce'est la méthode recommandée pour les données erronées, et peut convertir les valeurs invalides enNaN, puis utilisezfillna()pour remplir. - Pour les colonnes comportant de nombreuses valeurs uniques, un type catégoriel peut réduire considérablement l'utilisation de la mémoire.
Autres extensions