Fonction df.fillna() de Pandas

Pandas 常用函数Fonctions courantes de Pandas


df.fillna()est une fonction de Pandas utilisée pour remplir les valeurs manquantes.

etdropna()Contrairement à la suppression des valeurs manquantes,fillna()elle permet de remplir les données manquantes avec des valeurs spécifiées, la moyenne, la médiane, un remplissage vers l'avant ou vers l'arrière, etc. C'est très utile pour maintenir l'intégrité des données et l'exactitude de l'analyse.


Syntaxe de base et paramètres

fillna()est une fonction membre de DataFrame, appelée via l'opérateur point.pour appeler.

Format de syntaxe

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

Description du paramètre

Paramètre Type Requis Description Valeur par défaut
value scalaire, dict, Series, DataFrame Optional La valeur utilisée pour remplir les valeurs manquantes. Elle peut être une constante, un dictionnaire (spécifiant différentes valeurs pour différentes colonnes), une Series ou un DataFrame. Aucune
method str Optional Méthode de remplissage.'ffill'ou'pad'Indique le remplissage avec la valeur précédente (remplissage avant) ;'bfill'ou'backfill'Indique le remplissage avec la valeur suivante (remplissage arrière). Aucune
axis int ou str Optional Spécifie la direction du remplissage.0ou'index'Indique un remplissage le long des lignes ;1ou'columns'Indique un remplissage le long des colonnes. Uniquement lorsquemethodn'est pasNoneest-il valide. 0
inplace bool Optional SiTrue, il modifie directement le DataFrame d'origine et ne renvoie pas un nouvel objet ; siFalse, il renvoie un nouveau DataFrame, et les données d'origine restent inchangées. False
limit int Optional Spécifie le nombre maximal de remplissages consécutifs. Par exemple, définirlimit=1signifie remplir seulement 1 valeur manquante à la fois. Aucune
downcast dict ou str Optional Spécifie les règles de downcasting des types de données, telles que la conversion de float64 en int64. Aucune

Description de la valeur de retour

  • Renvoie un nouveau DataFrame (siinplace=False), ouNone(siinplace=True)。
  • Dans le DataFrame renvoyé, les valeurs manquantes ont été remplies.

Exemples

À travers une série d'exemples, maîtrisons parfaitementfillna()l'utilisation de df.fillna().

Exemple 1 : Remplir toutes les valeurs manquantes avec une constante

L'utilisation la plus simple consiste à remplir toutes les valeurs manquantes avec une constante.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des valeurs manquantes
data = {
    'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu'],
    'Age': [25, np.nan, 35, np.nan],  # valeur manquante
    'Salary': [5000, 6000, np.nan, 8000],  # valeur manquante
    'Département': ['Technologie', 'Marketing', 'Technologie', np.nan]  # valeur manquante
}
df = pd.DataFrame(data)

print("Données d'origine :")
print(df)
print("=" * 50)

# Remplir toutes les valeurs manquantes avec la constante 0
df_filled = df.fillna(0)

print("Données après remplissage avec 0 :")
print(df_filled)

Sortie attendue :

原始数据:
    姓名   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1  李四   NaN  6000.0  市场
2  王五  35.0     NaN  技术
3  赵六   NaN  8000.0  NaN
==================================================
用0填充后的数据:
    名称   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1  李四   0.0  6000.0  市场
2  王五  35.0     0.0  技术
3  赵六   0.0  8000.0  0

Explication du code :

  1. Nous avons créé un DataFrame contenant plusieurs valeurs manquantes.
  2. Utiliserdf.fillna(0)pour remplacer toutes les valeurs manquantes par 0.
  3. Cette méthode est simple et directe, mais peut ne pas convenir à tous les scénarios ; par exemple, remplir l'âge et le salaire avec 0 peut ne pas être raisonnable.

Exemple 2 : Spécifier différentes valeurs de remplissage pour différentes colonnes avec un dictionnaire

Vous pouvez spécifier différentes valeurs de remplissage pour différentes colonnes afin de rendre les données plus raisonnables.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des valeurs manquantes
data = {
    'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu'],
    'Age': [25, np.nan, 35, np.nan],
    'Salary': [5000, 6000, np.nan, 8000],
    'Département': ['Technologie', 'Marketing', 'Technologie', np.nan],
    'Performance': [85, 90, np.nan, 95]
}
df = pd.DataFrame(data)

print("Données d'origine :")
print(df)
print("=" * 50)

# Utiliser un dictionnaire pour spécifier différentes valeurs de remplissage pour différentes colonnes
fill_values = {
    'Age': 30,  # Remplir les âges manquants avec 30
    'Salary': 6500,  # Remplir les salaires manquants avec 6500
    'Department': 'Unassigned',  # Remplir les départements manquants avec "Unassigned"
    'Performance': 80  # Remplir les performances manquantes avec 80
}
df_filled = df.fillna(fill_values)

print("Données après remplissage de différentes colonnes avec différentes valeurs :")
print(df_filled)

Sortie attendue :

原始数据:
    姓名   年龄    薪资  部门  绩效
0  张三  25.0  5000.0  技术   85
1  李四   NaN  6000.0  市场   90
2  王五  35.0     NaN  技术  NaN
3  赵六   NaN  8000.0  NaN   95
==================================================
不同列用不同值填充后的数据:
    姓名   年龄    薪资   部门  绩效
0  张三  25.0  5000.0   技术   85
1  李四  30.0  6000.0   市场   90
2  王五  35.0  6500.0   技术   80
3  赵六  30.0  8000.0  未分配   95

Explication du code :

  • Grâce au dictionnairefill_values, nous avons spécifié des valeurs de remplissage raisonnables pour chaque colonne.
  • Cette méthode est plus flexible et permet de définir des valeurs par défaut appropriées pour différents champs en fonction de la logique métier.

Exemple 3 : Remplir les colonnes numériques avec la moyenne ou la médiane

Pour les données numériques, remplir avec la moyenne ou la médiane est une méthode courante et raisonnable.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des valeurs manquantes
data = {
    'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', 'Qian Qi'],
    'Math': [85, 90, np.nan, 78, 92],
    'English': [88, np.nan, 82, 85, 90],
    'Physics': [np.nan, 85, 90, 88, 95]
}
df = pd.DataFrame(data)

print("Données d'origine :")
print(df)
print("=" * 50)

# Calculer la moyenne de chaque colonne
math_mean = df['Math'].mean()
english_mean = df['English'].mean()
physics_mean = df['Physics'].mean()

print(f"Moyenne en mathématiques : {math_mean:.2f}")
print(f"Moyenne en anglais : {english_mean:.2f}")
print(f"Moyenne en physique : {physics_mean:.2f}")
print("=" * 50)

# Remplir avec la moyenne
df_filled = df.fillna({
    'Math': math_mean,
    'English': english_mean,
    'Physics': physics_mean
})

print("Données après remplissage avec la moyenne :")
print(df_filled)

Sortie attendue :

原始数据:
    姓名  数学  英语  物理
0  张三  85.0  88.0  NaN
1  李四  90.0  NaN  85.0
2  王五  NaN  82.0  90.0
3  赵六  78.0  85.0  88.0
4  钱七  92.0  90.0  95.0
==================================================
数学均值: 86.25
英语均值: 86.25
物理均值: 89.50
==================================================
用均值填充后的数据:
    姓名   数学   英语   物理
0  张三  85.0  88.0  89.5
1  李四  90.0  86.25  85.0
2  王五  86.25  82.0  90.0
3  赵六  78.0  85.0  88.0
4  钱七  92.0  90.0  95.0

Explication du code :

  • Utiliserdf['列名'].mean()pour calculer la moyenne de chaque colonne.
  • L'utilisation de la moyenne calculée comme valeur de remplissage préserve les caractéristiques de distribution globale des données tout en résolvant le problème des valeurs manquantes.

Exemple 4 : Utiliser le remplissage vers l'avant (ffill) et le remplissage vers l'arrière (bfill)

Le remplissage vers l'avant remplit les valeurs manquantes avec la valeur valide précédente, et le remplissage vers l'arrière remplit les valeurs manquantes avec la valeur valide suivante.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des valeurs manquantes
data = {
    'Date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
    'Temperature': [20, np.nan, 22, np.nan, 25],
    'Humidity': [60, 65, np.nan, 70, 75]
}
df = pd.DataFrame(data)

print("Données d'origine :")
print(df)
print("=" * 50)

# Remplissage vers l'avant : remplir les valeurs manquantes avec la valeur précédente
df_ffill = df.fillna(method='ffill')
print("Données après remplissage vers l'avant (ffill) :")
print(df_ffill)
print("=" * 50)

# Remplissage vers l'arrière : remplir les valeurs manquantes avec la valeur suivante
df_bfill = df.fillna(method='bfill')
print("Données après remplissage vers l'arrière (bfill) :")
print(df_bfill)

Sortie attendue :

原始数据:
        日期   温度   湿度
0  2024-01-01  20.0  60.0
1  2024-01-02  NaN  65.0
2  2024-01-03  22.0  NaN
3  2024-01-04  NaN  70.0
4  2024-01-05  25.0  75.0
==================================================
向前填充(ffill)后的数据:
        日期   温度   湿度
0  2024-01-01  20.0  60.0
1  2024-01-02  20.0  65.0  # 用前一个值20填充
2  2024-01-03  22.0  65.0  # 用前一个值65填充
3  2024-01-04  22.0  70.0  # 用前一个值22填充
4  2024-01-05  25.0  75.0
==================================================
向后填充(bfill)后的数据:
        日期   温度   湿度
0  2024-01-01  20.0  60.0
1  2024-01-02  22.0  65.0  # 用后一个值22填充
2  2024-01-03  22.0  70.0  # 用后一个值70填充
填充
3  2024-01-04  25.0  70.0  # 用后一个值25填充
4  2024-01-05  25.0  75.0

Explication du code :

  • Remplissage vers l'avant (ffill) : la température de la ligne 1 est manquante, remplissez-la avec 20 de la ligne 0 ; la température de la ligne 3 est manquante, remplissez-la avec 22 de la ligne 2.
  • Remplissage vers l'arrière (bfill) : la température de la ligne 1 est manquante, remplissez-la avec 22 de la ligne 2 ; la température de la ligne 3 est manquante, remplissez-la avec 25 de la ligne 4.
  • Cette méthode est adaptée aux données de séries temporelles, telles que les cours des actions, les relevés de température, etc.

Exemple 5 : Utiliser le paramètre limit pour limiter le nombre de remplissages

limitLe paramètre limit peut limiter le nombre maximal de remplissages consécutifs.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant plusieurs valeurs manquantes consécutives
data = {
    'A': [1, np.nan, np.nan, np.nan, 5],
    'B': [1, 2, np.nan, np.nan, 5]
}
df = pd.DataFrame(data)

print("Données d'origine :")
print(df)
print("=" * 50)

# Remplissage vers l'avant, mais limiter le remplissage à seulement 1 valeur manquante consécutive à la fois
df_filled = df.fillna(method='ffill', limit=1)

print(Données après limitation du nombre de remplissages consécutifs à 1 :)
print(df_filled)

Sortie attendue :

原始数据:
     A    B
0  1.0  1.0
1  NaN  2.0
2  NaN  NaN
3  NaN  NaN
4  5.0  5.0
==================================================
限制连续填充数量为1后的数据:
     A    B
0  1.0  1.0
1  1.0  2.0  # 填充1个
2  NaN  2.0  # 达到limit,不再填充
3  NaN  NaN  # 继续不填充
4  5.0  5.0

Explication du code :

  • Pour la colonne A, la valeur manquante de la ligne 1 est remplie avec 1, mais les lignes 2 et 3 ne sont plus remplies car la limite limit=1 est atteinte.
  • Pour la colonne B, la valeur manquante de la ligne 2 est remplie avec 2, et la ligne 3 n'est plus remplie car la limite limit=1 est atteinte.

Exemple 6 : Remplir les valeurs manquantes par interpolation

Pandas fournit égalementinterpolate()une méthode de remplissage par interpolation, adaptée aux données numériques.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des valeurs manquantes
data = {
    'x': [1, 2, 3, 4, 5],
    'y': [10, np.nan, 30, np.nan, 50]
}
df = pd.DataFrame(data)

print(Données brutes :)
print(df)
print("=" * 50)

# Utiliser l'interpolation linéaire pour remplir
df_interpolated = df.copy()
df_interpolated['y'] = df_interpolated['y'].interpolate(method='linear')

print(Données après remplissage par interpolation linéaire :)
print(df_interpolated)

Sortie attendue :

原始数据:
   x   y
0  1  10.0
1  2  NaN
2  3  30.0
3  4  NaN
4  5  50.0
==================================================
线性插值填充后的数据:
   x   y
0  1  10.0
1  2  20.0  # 插值:10 + (30-10)/(3-1)*(2-1) = 20
2  3  30.0
3  4  40.0  # 插值:30 + (50-30)/(5-3)*(4-3) = 40
4  5  50.0

Explication du code :

  • L'interpolation linéaire calcule les valeurs manquantes à partir des valeurs connues avant et après.
  • Ligne 1 : 10 + (30-10)/(3-1)*(2-1) = 20.
  • Ligne 3 : 30 + (50-30)/(5-3)*(4-3) = 40.
  • La méthode d'interpolation convient aux données dont les valeurs changent linéairement.

Notes

  • fillna()Par défaut, le DataFrame d'origine n'est pas modifié. Si vous souhaitez modifier en place, utilisezinplace=Trueparamètre.
  • RemarquemethodLe paramètre pourrait être déprécié dans les futures versions de Pandas. Il est recommandé d'utiliserffill()etbfill()méthode à la place.
  • Lors de l'utilisation du remplissage par la moyenne, s'il y a des valeurs extrêmes (valeurs aberrantes) dans les données, envisagez d'utiliser le remplissage par la médiane, qui est plus robuste.
  • Pour les données catégorielles (telles que le service, le poste), il est recommandé de remplir avec la valeur la plus fréquente (mode) ou une catégorie explicite (telle que "Inconnu").
  • Avant de remplir les valeurs manquantes, il est recommandé d'analyser d'abord les causes et les motifs des valeurs manquantes, puis de choisir la méthode de remplissage la plus appropriée.

Pandas 常用函数Fonctions courantes de Pandas

Autres extensions