1091 votes

Écriture d'un DataFrame pandas dans un fichier CSV

J'ai un cadre de données dans pandas que je voudrais écrire dans un fichier CSV.

Je le fais en utilisant :

df.to_csv('out.csv')

Et j'obtiens l'erreur suivante :

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
  • Existe-t-il un moyen de contourner facilement ce problème (c'est-à-dire que j'ai des caractères unicodes dans mon cadre de données) ?
  • Existe-t-il un moyen d'écrire dans un fichier délimité par des tabulations au lieu d'un CSV en utilisant, par exemple, une méthode 'to-tab' (qui, à mon avis, n'existe pas) ?

1454voto

Andy Hayden Points 38010

Pour délimiter par une tabulation, vous pouvez utiliser la fonction sep argument de to_csv :

df.to_csv(file_name, sep='\t')

Pour utiliser un encodage spécifique (par exemple, 'utf-8'), utilisez la commande encoding argument :

df.to_csv(file_name, sep='\t', encoding='utf-8')

152 votes

J'ajouterais index=False pour supprimer l'index.

32 votes

Au départ, je ne savais pas comment trouver une réponse à la question que j'avais déjà écrite il y a sept ans.

4 votes

Juste un petit conseil pour les autres personnes qui utilisent la fonction : terminez votre nom de fichier par .csv Je ne veux pas admettre combien de fois j'ai oublié de le faire.

381voto

Sayan Sil Points 2112

Lorsque vous stockez un DataFrame en un objet fichier csv en utilisant le to_csv vous n'aurez probablement pas besoin d'enregistrer la méthode indices précédents de chaque rangée de la DataFrame objet.

Vous pouvez éviter qu'en passant un False valeur booléenne à index paramètre.

Un peu comme :

df.to_csv(file_name, encoding='utf-8', index=False)

Donc si votre objet DataFrame est quelque chose comme :

  Color  Number
0   red     22
1  blue     10

Le fichier csv stockera :

Color,Number
red,22
blue,10

au lieu de (le cas où le valeur par défaut True a été adoptée)

,Color,Number
0,red,22
1,blue,10

0 votes

Que faire si l'indexation est souhaitée, mais qu'elle doit aussi comporter un titre ? Utilisez-vous simplement df.rename_axis('index_name') ? qui ne modifie pas le fichier lui-même

0 votes

Comment obtenir CR / ligne vide à la fin du fichier ? stackoverflow.com/questions/39237755/ Les réponses à une autre question n'ont pas fonctionné.

61voto

coldspeed Points 111053

Pour écrire un DataFrame de Pandas dans un fichier CSV, vous aurez besoin des éléments suivants DataFrame.to_csv . Cette fonction offre de nombreux arguments avec des valeurs par défaut raisonnables que vous devrez le plus souvent modifier pour les adapter à votre cas d'utilisation spécifique. Par exemple, vous pourriez vouloir utiliser un séparateur différent, changer le format de la date ou supprimer l'index lors de l'écriture. to_csv possède des arguments que vous pouvez passer pour répondre à ces exigences.

Voici un tableau listant quelques scénarios courants d'écriture dans des fichiers CSV et les arguments correspondants que vous pouvez utiliser pour eux.

Write to CSV ma dude

Notes de bas de page

  1. Le séparateur par défaut est supposé être une virgule ( ',' ). Ne modifiez pas ce paramètre, à moins que vous ne soyez sûr de devoir le faire.
  2. Par défaut, l'indice de df est écrit en première colonne. Si votre DataFrame n'a pas d'index (c'est-à-dire si la valeur de l'attribut df.index est la valeur par défaut RangeIndex ), vous voudrez alors définir index=False en écrivant. Pour expliquer cela d'une autre manière, si vos données ont un index, vous pouvez (et devriez) utiliser la méthode suivante index=True ou laissez-le complètement de côté (car la valeur par défaut est True ).
  3. Il serait judicieux de définir ce paramètre si vous écrivez des données de type chaîne de caractères afin que les autres applications sachent comment lire vos données. Cela évitera également tout risque de UnicodeEncodeError que vous pourriez rencontrer en sauvegardant.
  4. La compression est recommandée si vous écrivez de grands DataFrames (>100K lignes) sur le disque, car les fichiers de sortie seront beaucoup plus petits. Par contre, cela signifie que le temps d'écriture va augmenter (et par conséquent, le temps de lecture puisque le fichier devra être décompressé). temps de lecture puisque le fichier devra être décompressé).

39voto

Harvey Points 407

Exemple d'exportation dans un fichier avec chemin complet sous Windows et dans le cas où votre fichier a en-têtes :

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

Par exemple, si vous voulez stocker le fichier dans le même répertoire où se trouve votre script, avec encodage utf-8 et tabulation comme séparateur :

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')

26voto

Glen Thompson Points 1231

Si vous rencontrez des difficultés pour encoder en 'utf-8' et que vous souhaitez procéder cellule par cellule, vous pouvez essayer ce qui suit.

Python 2

(Où "df" est votre objet DataFrame).

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
            df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            df.set_value(idx,column,'')
            continue

Alors, essayez :

df.to_csv(file_name)

Vous pouvez vérifier l'encodage des colonnes par :

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

Attention : errors='ignore' omettra simplement le caractère, par exemple

IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'

Python 3

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
            df.set_value(idx,column,x)
        except Exception:
            print('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X