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

pandasにデータフレームがあり、それをCSVファイルに書き込みたいと思っています。私はこれを

df.to_csv('out.csv')

そして、エラーが発生します。

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

これを簡単に回避する方法はありますか(データフレームにユニコード文字がある場合など)?また、例えば 'to-tab'メソッド(存在しないと思いますが)を使って、CSVではなくタブ区切りのファイルに書き込む方法はありますか?

ソリューション

タブで区切るには、to_csvsep 引数を使います。

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

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

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

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
解説 (0)

UTF-8を指定した場合にも、このような問題が発生することがあります。 ファイルの読み込み時にエンコーディングを指定し、ファイルへの書き込み時にも同じエンコーディングを指定することをお勧めします。 これで問題が解決するかもしれません。

解説 (0)