pandas DataFrameをCSVファイルに書き込む


715

CSVファイルに書き込みたいパンダのデータフレームがあります。私はこれを使ってこれをやっています:

df.to_csv('out.csv')

そしてエラーを取得する:

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

これを簡単に回避する方法はありますか(つまり、データフレームにUnicode文字があります)?そして、例えば「to-tab」メソッドを使用してCSVの代わりにタブ区切りファイルに書き込む方法はありますか(私は存在しないと思います)?

回答:


1045

タブで区切るには、次のsep引数を使用できますto_csv

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

特定のエンコーディング( 'utf-8'など)を使用するには、encoding引数を使用します。

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

32
index=Falseインデックスを削除するために追加します。
Medhat

11
私は、7年前にすでに書いた質問に対する答えを見つける方法について最初は混乱していました。
ヘイデン

251

あなたが格納されたときDataFrameにオブジェクトをCSVファイル使用to_csv方法を、おそらく習慣格納する必要があること先行指標それぞれのDataFrameオブジェクト。

ブール値をパラメーターに渡すことで、これを回避できます。Falseindex

やや好き:

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

したがって、DataFrameオブジェクトが次のような場合:

  Color  Number
0   red     22
1  blue     10

csvファイルには次のものが格納されます。

Color,Number
red,22
blue,10

の代わりに(デフォルト値 Trueが渡された場合)

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

索引付けが必要だがタイトルも必要な場合はどうなりますか?使用するだけdf.rename_axis('index_name')ですか?ファイル自体は変更されません
Zap

20

pandas DataFrameをCSVファイルに書き込むには、が必要DataFrame.to_csvです。この関数は、多くの引数を適切なデフォルトで提供しますが、特定のユースケースに合わせてオーバーライドする必要はほとんどありません。たとえば、別の区切り文字を使用したり、日時形式を変更したり、書き込み時にインデックスを削除したりすることができます。to_csvこれらの要件に対処するために渡すことができる引数があります。

以下の表は、CSVファイルへの書き込みの一般的なシナリオと、それらに使用できる対応する引数の一覧です。

CSVに書き込む

脚注

  1. デフォルトの区切り文字はコンマ(',')であると見なされます。必要な場合を除いて、これを変更しないでください。
  2. デフォルトでは、インデックスはdf最初の列として書き込まれます。DataFrameにインデックスがない場合(IOW、これdf.indexがデフォルトですRangeIndex)、index=False書き込み時に設定する必要があります。これを別の方法で説明すると、データにインデックスがある場合は、それを使用するindex=Trueか、または完全に省略することができます(デフォルトであるのでTrue)。
  3. 文字列データを書き込む場合は、このパラメーターを設定して、他のアプリケーションがデータの読み取り方法を認識できるようにすることをお勧めします。これによりUnicodeEncodeError、保存中に発生する可能性のあるs も回避されます。
  4. 大きなデータフレーム(> 100K行)をディスクに書き込む場合は、出力ファイルがはるかに小さくなるため、圧縮をお勧めします。OTOH、これは、書き込み時間が増加することを意味します(その結果、ファイルを解凍する必要があるため、読み取り時間が増加します)。

18

「utf-8」へのエンコードに問題があり、セルごとに移動したい場合は、次のことを試してみてください。

Python 2

(「df」は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

次に試してください:

df.to_csv(file_name)

列のエンコーディングは、次の方法で確認できます。

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

警告:errors = 'ignore'は文字を省略します。例:

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

11

UTF-8エンコードも指定すると、これらの問題に直面することがあります。ファイルを読み取るときにエンコードを指定し、ファイルに書き込むときに同じエンコードを指定することをお勧めします。これで問題が解決する可能性があります。


7

Windowsフルパスを使用してファイルにエクスポートする例と、ファイルにヘッダーがある場合:

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

utf-8エンコーディングセパレーターとしてのタブを使用して、スクリプトと同じディレクトリのフォルダーに保存する場合の例:

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

7

この場合の答えにはならないかもしれませんが、同じエラーメッセージ.to_csvを試し.toCSV('name.csv')、エラーメッセージが異なっていたため( " SparseDataFrame' object has no attribute 'toCSV')、データフレームを高密度データフレームに変換することで問題が解決しました

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

使用.toCSVしていないように見えるため、2番目のエラーが表示されます.to_csv。アンダースコアを忘れた
カイルC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.