Pandas read_csv() dans Python avec exemple
โก Rรฉsumรฉ intelligent
La fonction `read_csv()` de Pandas convertit un fichier CSV (local ou distant) en un DataFrame en un seul appel. Ce tutoriel importe le jeu de donnรฉes du recensement des adultes de l'UCI, nomme ses quinze colonnes et synthรฉtise le rรฉsultat ร l'aide de regroupements `groupby`.
Importer CSV dans Pandas
Au cours du tutoriel TensorFlow, vous utiliserez ensemble de donnรฉes pour adultes, souvent utilisรฉ pour les tรขches de classification. Le fichier utilisรฉ ci-dessous est le fichier brut adult.data L'exportation depuis le dรฉpรดt d'apprentissage automatique de l'UCI, et la page du jeu de donnรฉes propose รฉgalement un tรฉlรฉchargement compressรฉ et le ucimlrepo package si le chemin direct cesse un jour de se rรฉsoudre.
Les donnรฉes sont stockรฉes au format CSV. L'ensemble de donnรฉes comprend 8 variables catรฉgorielles :
- classe ouvriรจre
- l'รฉducation
- matrimonial
- occupation
- relations
- breed
- sexe
- pays d'origine
Et 6 variables continues :
- รขge
- fnlwgt
- num_education
- gain_capital
- perte_de_capital
- heures_semaine
Avec les revenus label colonne, ce qui constitue les 15 noms de colonnes que vous transmettrez ร Pandas dans la section suivante.
Mรฉthode Pandas read_csv()
Pour importer un jeu de donnรฉes CSV, vous pouvez utiliser l'objet pd.read_csv(). La signature de base est :
Syntaxe Pandas read_csv()
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- chemin_fichier_ou_buffer: chemin, URLou un objet de type fichier contenant les donnรฉes
- sep=',': le dรฉlimiteur ร utiliser
- noms=AucunNommez les colonnes. Si l'ensemble de donnรฉes comporte dix colonnes, vous devez fournir dix noms.
- index_col=Aucun: colonne ร utiliser comme index de ligne. Passez False pour forcer un nouvel index entier.
- ignorer l'espace initial=False: ignorer les espaces aprรจs le dรฉlimiteur
Pour la liste complรจte des arguments, consultez le site officiel. documentation de pandas.read_csv().
Exemple Pandas read_csv()
L'extrait ci-dessous nomme les 15 colonnes, pointe vers le fichier UCI et supprime l'espace qui suit chaque virgule dans cet ensemble de donnรฉes particulier.
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
Sortie :
(32561, 15)
La forme confirme 32 561 lignes et 15 colonnes, donc chaque nom dans COLUMNS a รฉtรฉ associรฉ ร un champ du fichier.
Paramรจtres clรฉs de la fonction read_csv() de Pandas
La fonction `read_csv()` accepte plus de cinquante arguments, mais un petit nombre d'entre eux couvrent la quasi-totalitรฉ des importations courantes. Les valeurs par dรฉfaut ci-dessous sont celles documentรฉes dans la documentation de l'API pandas.
| Paramรจtres | Rรฉglage par dรฉfaut | Ce qu'il fait |
| sep | ',' | Caractรจre ou expression rรฉguliรจre utilisรฉ comme dรฉlimiteur. Utilisez sep=';' ou sep='\t' pour les autres formats. |
| entรชte | 'dรฉduire' | Numรฉro de ligne contenant les รฉtiquettes de colonne. Indiquez header=None si le fichier ne contient pas de ligne d'en-tรชte. |
| noms | pas fixรฉ | Liste explicite des รฉtiquettes de colonnes. ร combiner avec header=0 pour remplacer un en-tรชte existant. |
| index_col | Aucun | Colonne ร utiliser comme index de ligne. index_col=False force un index entier simple. |
| usecols | Aucun | Sรฉlection d'un sous-ensemble de colonnes ร charger, par รฉtiquette ou position. Cela rรฉduit le temps d'analyse et la consommation de mรฉmoire. |
| type | Aucun | Types de donnรฉes par colonne, par exemple {'age': 'int32'}. Ignore l'infรฉrence de type. |
| valeurs_na | Aucun | Chaรฎnes supplรฉmentaires ร lire comme NaN, telles que le caractรจre de remplacement '?' dans l'ensemble de donnรฉes pour adultes. |
| lignes sautรฉes / lignes manquantes | Aucun | Ignorer les premiรจres lignes ou ne lire que les N premiรจres lignes de donnรฉes. |
| analyser_dates | Aucun | Colonnes ร convertir en date et heure lors de la lecture, associรฉes ร date_format. |
| codage | 'utf-8' | Encodage du texte du fichier. Utilisez ยซ latin-1 ยป ou ยซ cp1252 ยป pour les exportations hรฉritรฉes. |
| taille des morceaux | Aucun | Renvoie un itรฉrateur qui produit le fichier par blocs de N lignes. |
| sur_les_mauvaises_lignes | 'erreur' | Que faire des lignes mal formรฉes : les surรฉlever, les signaler ou les ignorer ? |
Deux d'entre elles mรฉritent d'รชtre mentionnรฉes. index_col=False Ce n'est pas la mรชme chose que de ne pas le dรฉfinir : cela indique explicitement ร Pandas de ne pas promouvoir la premiรจre colonne, ce qui est souhaitable lorsqu'un fichier termine chaque ligne par un dรฉlimiteur parasite. names รฉcrase silencieusement tout ce que le fichier dรฉclare, donc passez header=0 en plus, lorsque le fichier CSV comporte effectivement une ligne d'en-tรชte.
Mรฉthode Pandas groupby()
Pour visualiser facilement les donnรฉes, utilisez la mรฉthode `groupby`. Cette mรฉthode permet de synthรฉtiser les donnรฉes par groupe. Voici la liste des agrรฉgations disponibles avec la mรฉthode `groupby()` :
- compter : compter
- minute : minute
- maximum : maximum
- signifier: signifier
- mรฉdiane : mรฉdiane
- รฉcart type : std
- et bien d'autres
Dans la fonction groupby(), vous indiquez la colonne sur laquelle vous souhaitez effectuer le regroupement avant d'appliquer l'agrรฉgation.
Examinons un seul groupeping avec l'ensemble de donnรฉes adultes. Vous obtiendrez la moyenne de toutes les variables continues par type de revenu, c'est-ร -dire supรฉrieur ร 50 000 ou infรฉrieur ร 50 000 :
df_train.groupby(['label']).mean()
| รฉtiquette | รขge | fnlwgt | num_education | gain_capital | perte_de_capital | heures_semaine |
| <= 50 | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50K | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
Vous pouvez obtenir l'รขge minimum par type de mรฉnage :
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Vous pouvez รฉgalement regrouper sur plusieurs colonnes. Par exemple, vous pouvez obtenir une plus-value maximale en fonction du type de mรฉnage et de l'รฉtat civil.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital <=50K Divorced 34095 Married-AF-spouse 2653 Married-civ-spouse 41310 Married-spouse-absent 6849 Never-married 34095 Separated 7443 Widowed 6849 >50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
Il est possible de crรฉer un graphique aprรจs un regroupement. Une mรฉthode consiste ร tracer directement le rรฉsultat groupรฉ.
Pour obtenir un graphique plus clair, appliquez la fonction `unstack()` aprรจs `mean()` afin que le statut matrimonial soit dรฉplacรฉ de l'index vers les colonnes. Le graphique comporte alors deux groupes, un par tranche de revenu, au lieu des quatorze (2*7) barres qu'un index multiniveau plat produirait.
Si vous utilisez un Jupyter CarnetsN'oubliez pas d'ajouter %matplotlib en ligne, sinon aucun graphique ne s'affichera.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
La reprรฉsentation de cette trame non empilรฉe sous forme de graphique ร barres donne la figure ci-dessous.
Comment lire de gros fichiers CSV avec Pandas
L'ensemble de donnรฉes pour adultes est restreint, mais le mรชme appel peut bloquer lors d'une exportation de plusieurs gigaoctets. Trois arguments suffisent pour l'essentiel du travail.
- usecols Ne charge que les colonnes nรฉcessaires. La documentation de pandas indique que cela permet un traitement beaucoup plus rapide et une consommation de mรฉmoire rรฉduite.
- type Associe chaque colonne ร un type, de sorte que Pandas ignore l'infรฉrence et n'รฉtend pas les entiers ร 64 bits par dรฉfaut.
- taille des morceaux renvoie un TextFileReader au lieu d'un DataFrame, vous permettant de parcourir des blocs de N lignes et d'effectuer des agrรฉgations au fur et ร mesure.
import pandas as pd # read only the columns you need, with explicit types cols = ['age', 'education', 'capital_gain', 'label'] types = {'age': 'int32', 'capital_gain': 'int32'} df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types, skipinitialspace=True, index_col=False) # stream the file in fixed-size chunks instead of loading it whole total = 0 for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000, skipinitialspace=True, index_col=False): total = total + len(chunk) print(total)
Deux autres options s'avรจrent utiles une fois les bases รฉtablies. engine='pyarrow' passe au parseur Arrow multithread, et dtype_backend='pyarrow' conserve le rรฉsultat dans des colonnes avec flรจches. low_memory La valeur par dรฉfaut est True, ce qui analyse le fichier en interne par morceaux, mais cela peut produire des types mixtes dans une colonne ; dรฉfinissez un dtype explicite plutรดt que de vous y fier.
Enfin, des compression='infer' Cela signifie qu'un chemin se terminant par .gz, .zip, .bz2, .xz ou .zst est dรฉcompressรฉ ร la volรฉe, il n'est donc pas nรฉcessaire de dรฉcompresser une archive avant de la lire.
Erreurs courantes de la fonction read_csv() de Pandas et comment les corriger
La plupart des รฉchecs de read_csv() proviennent de quatre causes, et chacune possรจde un argument documentรฉ qui la rรฉsout.
| Erreur | Causes | Fixer |
| FileNotFoundError | Le chemin est relatif au rรฉpertoire de travail, et non au script. | Utilisez un chemin absolu ou confirmez le URL Le schรฉma est l'un des suivants : http, ftp, s3, gs ou fichier. |
| Erreur de dรฉcodage Unicode | Le fichier n'est pas au format UTF-8, qui est l'encodage par dรฉfaut. | Transmettez encoding='latin-1โฒ ou le codec correct, ou encoding_errors='replace'. |
| Erreur d'analyse : Erreur lors de la tokenisation des donnรฉes | Une ligne contient plus de champs que ceux dรฉclarรฉs dans l'en-tรชte. | Transmettez on_bad_lines='skip' ou 'warn', ou dรฉfinissez le sep correct. |
| DtypeWarning : les colonnes contiennent des types mixtes | L'infรฉrence de type par blocs a permis de dรฉtecter diffรฉrents types dans une mรชme colonne. | Dรฉfinissez un dtype explicite, ou low_memory=False. |
| Colonnes dรฉcalรฉes d'une unitรฉ | Un dรฉlimiteur final permet ร Pandas de promouvoir le premier champ dans l'index. | Passer index_col=False. |
L'ensemble de donnรฉes pour adultes montre directement le cas des valeurs manquantes : les entrรฉes inconnues pour la classe de travail, la profession et le pays natal sont stockรฉes sous la forme d'un point d'interrogation littรฉral, elles apparaissent donc sous la forme de la chaรฎne ยซ ? ยป ร moins que vous ne les dรฉclarais.
# tolerate rows with too many fields instead of raising df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip') # read a file that is not UTF-8 df = pd.read_csv('sales.csv', encoding='latin-1') # treat the dataset's '?' placeholder as a missing value df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

