web-dev-qa-db-fra.com

Python Pandas read_csv ignore les lignes mais conserve l'en-tête

Je ne parviens pas à comprendre comment ignorer n lignes dans un fichier csv, tout en conservant l'en-tête qui correspond à la ligne 1.

Ce que je veux faire, c'est itérer mais garder l'en-tête de la première ligne. skiprows fait de l'en-tête la première ligne après les lignes ignorées. Quelle est la meilleure façon de faire cela?

data = pd.read_csv('test.csv', sep='|', header=0, skiprows=10, nrows=10)
60
mcd

Vous pouvez passer une liste de numéros de lignes à skiprows au lieu d'un entier.

En donnant à la fonction l'entier 10, vous ne faites que sauter les 10 premières lignes.

Pour conserver la première ligne 0 (en-tête) et ignorer tout le reste jusqu'à la ligne 10, vous pouvez écrire:

pd.read_csv('test.csv', sep='|', skiprows=range(1, 10))

Autres façons de sauter des lignes en utilisant read_csv

Les deux principaux moyens de contrôler les lignes utilisées par read_csv Sont les paramètres header ou skiprows.

Supposons que nous avons le fichier CSV suivant avec une colonne:

a
b
c
d
e
f

Dans chacun des exemples ci-dessous, ce fichier est f = io.StringIO("\n".join("abcdef")).

  • Lire toutes les lignes comme des valeurs (pas d'en-tête, par défaut des entiers)

    >>> pd.read_csv(f, header=None)
       0
    0  a
    1  b
    2  c
    3  d
    4  e
    5  f
    
  • Utilisez une ligne particulière comme en-tête (ignorez toutes les lignes précédentes):

    >>> pd.read_csv(f, header=3)
       d
    0  e
    1  f
    
  • Utilisez plusieurs lignes comme en-tête créant un MultiIndex (ignore toutes les lignes avant la dernière ligne d'en-tête spécifiée):

    >>> pd.read_csv(f, header=[2, 4])                                                                                                                                                                        
       c
       e
    0  f
    
  • Ignorer N lignes du début du fichier (la première ligne non ignorée est l'en-tête):

    >>> pd.read_csv(f, skiprows=3)                                                                                                                                                                      
       d
    0  e
    1  f
    
  • Ignorez une ou plusieurs lignes en donnant leur index (la première ligne non ignorée est l'en-tête):

    >>> pd.read_csv(f, skiprows=[2, 4])                                                                                                                                                                      
       a
    0  b
    1  d
    2  f
    
85
Alex Riley

Excellentes réponses déjà .. Je ressens en quelque sorte le besoin d'ajouter la forme généralisée ici .. Considérez ce scénario: -

Supposons que votre fichier xls/csv comporte des lignes indésirables dans les deux premières lignes (ligne # 0,1). La rangée n ° 2 (3ème rangée) est l'en-tête réel et vous souhaitez charger 10 rangées à partir de la rangée n ° 50 (c'est-à-dire la 51e rangée). Voici l'extrait: -

pd.read_csv('test.csv', header=2, skiprows=range(3, 50), nrows=10)

6
Zakir

Pour développer la réponse de @ AlexRiley, l'argument skiprows prend une liste de nombres qui détermine les lignes à ignorer. Alors:

pd.read_csv('test.csv', sep='|', skiprows=range(1, 10))

est le même que:

pd.read_csv('test.csv', sep='|', skiprows=[1,2,3,4,5,6,7,8,9])

Le meilleur moyen d'ignorer des lignes spécifiques consiste à créer votre liste d'ignorations (manuellement ou avec une fonction telle que range qui renvoie une liste d'entiers) et à la transmettre à skiprows.

3
Prateek Khatri

Si vous parcourez un long fichier csv, vous pouvez utiliser l'argument chunksize . Si, pour une raison quelconque, vous devez le parcourir manuellement, vous pouvez essayer ce qui suit tant que vous savez le nombre d'itérations à effectuer:

for i in range(num_iters):
    pd.read_csv('test.csv', sep='|', header=0, 
                 skiprows = range(i*10 + 1, (i+1)*10), nrows=10)
1
JohnM

Si vous devez sauter/supprimer des lignes spécifiques, dites les 3 premières lignes (0,1,2), puis 2 autres lignes (4,5). Vous pouvez utiliser ce qui suit pour conserver la ligne d'en-tête:

df = pd.read_csv(file_in, delimiter='\t', skiprows=[0,1,2,4,5], encoding='utf-16', usecols=cols)
0
Lawrence Jacob