web-dev-qa-db-fra.com

Ecriture d'un fichier pandas DataFrame au format CSV

J'ai un dataframe dans pandas que je voudrais écrire dans un fichier CSV. Je fais cela en utilisant:

df.to_csv('out.csv')

Et avoir l'erreur:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

Existe-t-il un moyen de contourner ce problème facilement (c’est-à-dire que j’ai des caractères unicode dans mon cadre de données)? Et existe-t-il un moyen d'écrire dans un fichier délimité par des tabulations au lieu d'un fichier CSV en utilisant, par exemple, une méthode 'to-tab' (que je ne pense pas exister)?

555
user7289

Pour délimiter par un onglet, vous pouvez utiliser l'argument sep de to_csv :

_df.to_csv(file_name, sep='\t')
_

Pour utiliser un codage spécifique (par exemple, 'utf-8'), utilisez l'argument encoding:

_df.to_csv(file_name, sep='\t', encoding='utf-8')
_
867
Andy Hayden

Lorsque vous stockez un objet DataFrame dans un fichier csv à l'aide de la méthode to_csv, vous n'aurez probablement pas besoin de stocker les indices précédents de chaque rangée de l'objet DataFrame.

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

Un peu comme:

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

Donc, si votre objet DataFrame ressemble à 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éfautTrue a été passé)

,Color,Number
0,red,22
1,blue,10
189
Sayan Sil

Si vous ne voulez pas l'index.

 df.to_csv("out.csv", index=False)
18
Nages

Si vous rencontrez des problèmes d’encodage en "utf-8" et que vous souhaitez passer d’une cellule à l’autre, essayez 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 essaye:

df.to_csv(file_name)

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

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

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
16
Glen Thompson

Parfois, vous rencontrez ces problèmes si vous spécifiez également le codage UTF-8. Je vous recommande de spécifier le codage lors de la lecture de fichier et le même codage lors de l'écriture dans un fichier. Cela pourrait résoudre votre problème.

9
Harsha Komarraju

ce pourrait ne pas être la solution pour ce cas, mais comme j'avais le même message d'erreur avec .to_csv j'ai essayé .toCSV ('name.csv') et le message d'erreur était différent (l'objet "SparseDataFrame" n'a pas d'attribut "toCSV" "). Donc, le problème a été résolu en transformant dataframe en dataframe dense

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
4
Yury Wallet

Pour écrire un pandas DataFrame dans un fichier CSV, vous aurez besoin de DataFrame.to_csv . Cette fonction offre de nombreux arguments avec des valeurs par défaut raisonnables que vous devrez le plus souvent remplacer pour s'adapter à votre cas d'utilisation spécifique. Par exemple, vous pouvez utiliser un séparateur différent, modifier le format de date/heure ou supprimer l'index lors de l'écriture. _to_csv_ a des arguments que vous pouvez passer pour répondre à ces exigences.

Voici un tableau répertoriant certains scénarios courants d'écriture dans des fichiers CSV et les arguments correspondants que vous pouvez utiliser pour ceux-ci.

Write to CSV ma dude

Notes de bas de page

  1. Le séparateur par défaut est supposé être une virgule (_','_). Ne changez cela que si vous savez que vous en avez besoin.
  2. Par défaut, l'index de df est écrit en tant que première colonne. Si votre DataFrame ne possède pas d'index (IOW, le _df.index_ est le _ par défaut RangeIndex), vous voudrez alors définir _index=False_ lors de l'écriture. Pour expliquer cela différemment, si vos données ont un index, vous pouvez (et devriez) utiliser _index=True_ ou simplement le laisser complètement (la valeur par défaut est True).
  3. Il serait judicieux de définir ce paramètre si vous écrivez des données de chaîne afin que les autres applications sachent comment lire vos données. Cela évitera également tout potentiel UnicodeEncodeError que vous pourriez rencontrer lors de la sauvegarde.
  4. La compression est recommandée si vous écrivez des DataFrames volumineux (> 100 000 lignes) sur le disque, car les fichiers de sortie seront beaucoup plus petits. OTOH, cela signifiera que le temps d'écriture augmentera (et par conséquent, le temps de lecture puisque le fichier devra être décompressé).
2
cs95

Pour les données simples au format CSV .. Dans votre question, répondez également présent. Ce n'est pas la réponse à l'erreur ci-dessus

df.to_csv('output.csv')

Je poste parce que je trouve df en csv que j’utilise plus haut répond qu’il montre une erreur.

0
Alkesh Mahajan

Exemple d’exportation dans un fichier avec chemin complet sous Windows et si votre fichier contient des en-têtes:

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

Exemple si vous souhaitez stocker dans un dossier exporté qui se trouve dans le même répertoire que votre script, avec utf-8 encodint et tab comme séparateur:

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