Exemple de comment filtrer les données manquantes (NAN, NULL) d'une DataFrame avec Pandas ?
Table des matières
- Créer une DataFrame avec Pandas
- Trouver les colonnes avec des données manquantes
- Obtenir une liste des colonnes avec des données manquantes
- Nombre de données manquantes par colonnes
- Nombre de données manquantes pour une colonne donnée
- Obtenir la colonne avec le plus grand nombre de données manquantes
- Nombre total de données manquantes dans la DataFrame
- Supprimer les colonnes avec plus de 50% de données manquantes
- Trouver les lignes avec des données manquantes
- Obtenir une liste des lignes avec des données manquantes
- Nombre de données manquantes par lignes
- Nombre de données manquantes pour une ligne donnée
- Obtenir la ligne avec le plus grand nombre de données manquantes
- Supprimer les lignes avec des données manquantes
- Références
Créer une DataFrame avec Pandas
Soit par exemple le fichier csv suivant train.csv (que l'on peut télécharger sur kaggle). Pour lire le fichier il existe la fonction pandas read_csv():
>>> import pandas as pd>>> data = pd.read_csv('train.csv')
Dimensions de la dataframe:
>>> data.shape(1460, 81)
Visualiser les données avec head():
>>> df.head()Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \0 1 60 RL 65.0 8450 Pave NaN Reg1 2 20 RL 80.0 9600 Pave NaN Reg2 3 60 RL 68.0 11250 Pave NaN IR13 4 70 RL 60.0 9550 Pave NaN IR14 5 60 RL 84.0 14260 Pave NaN IR1LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal \0 Lvl AllPub ... 0 NaN NaN NaN 01 Lvl AllPub ... 0 NaN NaN NaN 02 Lvl AllPub ... 0 NaN NaN NaN 03 Lvl AllPub ... 0 NaN NaN NaN 04 Lvl AllPub ... 0 NaN NaN NaN 0MoSold YrSold SaleType SaleCondition SalePrice0 2 2008 WD Normal 2085001 5 2007 WD Normal 1815002 9 2008 WD Normal 2235003 2 2006 WD Abnorml 1400004 12 2008 WD Normal 250000
Trouver les colonnes avec des données manquantes
Pour determiner si une colonne de la DataFRame contient une donnée manquante (NAN ou NULL) on peut utiliser isnull et any, exemple:
>>> df.isnull().any()Id FalseMSSubClass FalseMSZoning FalseLotFrontage TrueLotArea FalseStreet FalseAlley TrueLotShape FalseLandContour FalseUtilities FalseLotConfig FalseLandSlope FalseNeighborhood FalseCondition1 FalseCondition2 FalseBldgType FalseHouseStyle FalseOverallQual FalseOverallCond FalseYearBuilt FalseYearRemodAdd FalseRoofStyle FalseRoofMatl FalseExterior1st FalseExterior2nd FalseMasVnrType TrueMasVnrArea TrueExterQual FalseExterCond FalseFoundation False...BedroomAbvGr FalseKitchenAbvGr FalseKitchenQual FalseTotRmsAbvGrd FalseFunctional FalseFireplaces FalseFireplaceQu TrueGarageType TrueGarageYrBlt TrueGarageFinish TrueGarageCars FalseGarageArea FalseGarageQual TrueGarageCond TruePavedDrive FalseWoodDeckSF FalseOpenPorchSF FalseEnclosedPorch False3SsnPorch FalseScreenPorch FalsePoolArea FalsePoolQC TrueFence TrueMiscFeature TrueMiscVal FalseMoSold FalseYrSold FalseSaleType FalseSaleCondition FalseSalePrice Falsedtype: bool
Obtenir une liste des colonnes avec des données manquantes
On peut alors en déduire une liste de colonnes contenant des données manquantes:
>>> df.columns[df.isnull().any()]Index(['LotFrontage', 'Alley', 'MasVnrType', 'MasVnrArea', 'BsmtQual','BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2','Electrical', 'FireplaceQu', 'GarageType', 'GarageYrBlt','GarageFinish', 'GarageQual', 'GarageCond', 'PoolQC', 'Fence','MiscFeature'],dtype='object')
Nombre de données manquantes par colonnes
Pour connaitre le nombre de données manquantes par colonnes on peut utiliser sum():
>>> df.isnull().sum()Id 0MSSubClass 0MSZoning 0LotFrontage 259LotArea 0Street 0Alley 1369LotShape 0LandContour 0Utilities 0LotConfig 0LandSlope 0Neighborhood 0Condition1 0Condition2 0BldgType 0HouseStyle 0OverallQual 0OverallCond 0YearBuilt 0YearRemodAdd 0RoofStyle 0RoofMatl 0Exterior1st 0Exterior2nd 0MasVnrType 8MasVnrArea 8ExterQual 0ExterCond 0Foundation 0...BedroomAbvGr 0KitchenAbvGr 0KitchenQual 0TotRmsAbvGrd 0Functional 0Fireplaces 0FireplaceQu 690GarageType 81GarageYrBlt 81GarageFinish 81GarageCars 0GarageArea 0GarageQual 81GarageCond 81PavedDrive 0WoodDeckSF 0OpenPorchSF 0EnclosedPorch 03SsnPorch 0ScreenPorch 0PoolArea 0PoolQC 1453Fence 1179MiscFeature 1406MiscVal 0MoSold 0YrSold 0SaleType 0SaleCondition 0SalePrice 0
Nombre de données manquantes pour une colonne donnée
>>> df['Alley'].isnull().sum()1369
Obtenir la colonne avec le plus grand nombre de données manquantes
Pour obtenir la colonne avec le plus grand nombre de données manquantes on peut utiliser nlargest(1):
>>> df.isnull().sum().nlargest(1)PoolQC 1453dtype: int64
Exemple avec les 3 colonnes présentant le plus de données manquantes
>>> df.isnull().sum().nlargest(3)PoolQC 1453MiscFeature 1406Alley 1369dtype: int64
Nombre total de données manquantes dans la DataFrame
>>> df.isnull().sum().sum()6965
Supprimer les colonnes avec plus de 50% de données manquantes
Afficher le nom de la colonne et le nombre de données manquantes:
>>> column_with_nan = df.columns[df.isnull().any()]>>> df.shape(1460, 81)>>> for column in column_with_nan:... print(column, df[column].isnull().sum())...LotFrontage 259Alley 1369MasVnrType 8MasVnrArea 8BsmtQual 37BsmtCond 37BsmtExposure 38BsmtFinType1 37BsmtFinType2 38Electrical 1FireplaceQu 690GarageType 81GarageYrBlt 81GarageFinish 81GarageQual 81GarageCond 81PoolQC 1453Fence 1179MiscFeature 1406
Supprimer les colonnes de la dataframe avec plus de 50% de données manquantes en utiliser la fonction pandas drop():
>>> for column in column_with_nan:... if df[column].isnull().sum()*100.0/df_shape[0] > 50:... df.drop(column,1, inplace=True)...>>> df.shape(1460, 77)
Trouver les lignes avec des données manquantes
>>> df.isnull().any(axis=1)0 True1 False2 False3 False4 False5 True6 False7 True8 False9 False10 True11 False12 True13 False14 True15 True16 True17 True18 True19 True20 False21 False22 False23 False24 True25 False26 True27 False28 False29 True...1430 False1431 True1432 True1433 False1434 False1435 False1436 True1437 False1438 True1439 False1440 False1441 True1442 False1443 True1444 True1445 True1446 True1447 False1448 True1449 True1450 True1451 False1452 True1453 True1454 True1455 False1456 False1457 False1458 True1459 Truedtype: bool
Obtenir une liste des lignes avec des données manquantes
>>> df.index[df.isnull().any(axis=1)]Int64Index([ 0, 5, 7, 10, 12, 14, 15, 16, 17, 18,...1445, 1446, 1448, 1449, 1450, 1452, 1453, 1454, 1458, 1459],dtype='int64', length=877)
Nombre de données manquantes par lignes
0 11 02 03 04 05 16 07 18 09 010 111 012 213 014 115 116 117 618 119 120 021 022 023 024 125 026 127 028 029 1..1430 01431 21432 11433 01434 01435 01436 11437 01438 11439 01440 01441 11442 01443 11444 11445 11446 21447 01448 11449 61450 61451 01452 11453 61454 11455 01456 01457 01458 11459 1dtype: int64
Nombre de données manquantes pour une ligne donnée
>>> df.iloc[1453,:].isnull().sum()6
Obtenir la ligne avec le plus grand nombre de données manquantes
>>> df.isnull().sum(axis=1).nlargest(1)39 11dtype: int64>>> df.isnull().sum(axis=1).nlargest(3)39 15520 11533 11dtype: int64
Supprimer les lignes avec des données manquantes
>>> index_with_nan = df.index[df.isnull().any(axis=1)]>>> index_with_nan.shape(877,)>>> df.drop(index_with_nan,0, inplace=True)>>> df.shape(583, 77)>>>
Références
| Liens | Site |
|---|---|
| How do I get a summary count of missing/NaN data by column in 'pandas'? | stackoverflow |
| How to count nan values in a pandas DataFrame?) | stackoverflow |
| How to count the NaN values in a column in pandas DataFrame) | stackoverflow |
| How to find which columns contain any NaN value in Pandas dataframe (python) | stackoverflow |
| isnull | pandas doc |
| any | pandas doc |
