私はCSVファイルに書きたいパンダのデータフレームを持っています。私はこれを使っています:
df.to_csv('out.csv')
そしてエラーを取得します。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
これを簡単に回避する方法はありますか(つまり、データフレームにUnicode文字がある)。そして、例えばを使用してCSVの代わりにタブ区切りのファイルに書き込む方法があります。 'to-tab'メソッド(私は存在しないと思う)?
タブで区切るには、 to_csv
のsep
引数を使用できます。
df.to_csv(file_name, sep='\t')
特定のエンコーディング(例: 'utf-8')を使うには、encoding
引数を使います。
df.to_csv(file_name, sep='\t', encoding='utf-8')
to_csv
メソッドを使用してDataFrame
name__オブジェクトをcsvファイルに格納する場合、おそらくDataFrame
name__の各行の先行インデックスを格納する必要はないでしょう。オブジェクト.
False
name__ブール値をindex
name__パラメーターに渡すことで、それを回避できます。
やや似ている:
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
name__が渡された場合)
,Color,Number
0,red,22
1,blue,10
あなたが '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
あなたがインデックスが欲しくないならば。
df.to_csv("out.csv", index=False)
UTF-8エンコーディングも指定した場合、時々これらの問題に直面します。ファイルの読み取り中にエンコードを指定し、ファイルへの書き込み中に同じエンコードを指定することをお勧めします。これであなたの問題は解決するかもしれません。
それはこの場合の答えではないかもしれないが、私はと同じエラーメッセージを持っていたように .to_csv 私は試した .toCSV( 'name.csv') エラーメッセージが異なりました( "'SparseDataFrame'オブジェクトには属性 'toCSV'"がありません)。データフレームを密なデータフレームに変えることで問題は解決しました
df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
パンダDataFrameをCSVファイルに書き込むには、 DataFrame.to_csv
が必要になります。この関数は、あなたが特定のユースケースに合うためにオーバーライドする必要がないより合理的なデフォルトで多くの引数を提供します。たとえば、書き込み時に別の区切り記号を使用したり、日時書式を変更したり、索引をドロップしたりすることができます。 to_csv
には、これらの要件に対処するために渡すことができる引数があります。
CSVファイルへの書き込みに関する一般的なシナリオとそれに対応する引数をリストした表があります。
脚注
- デフォルトの区切り文字はコンマ(
','
)と見なされます。必要があるとわかっていない限り、これを変更しないでください。- デフォルトでは、
df
のインデックスは最初の列として書かれています。 DataFrameにインデックスがない場合(IOW、df.index
がデフォルトのRangeIndex
)、書き込み時にindex=False
を設定することをお勧めします。これを別の言い方で説明すると、データにインデックスがある場合は、index=True
を使用するか、完全に除外します(デフォルトはTrue
)。- 他のアプリケーションがあなたのデータを読む方法を知るようにあなたが文字列データを書いているならば、このパラメータを設定することは賢明でしょう。これにより、保存中に発生する可能性のある
UnicodeEncodeError
も回避されます。- 大きなDataFrame(> 100K行)をディスクに書き込む場合は、出力ファイルが非常に小さくなるため、圧縮をお勧めします。 OTOH、それは書き込み時間が増加することを意味します(そしてその結果、ファイルが解凍される必要があるので読み取り時間は増加します)。
Csvへの単純なデータフレームの場合..あなたの質問の答えにも存在します。これは上記のエラーの答えではありません
df.to_csv('output.csv')
上記の回答を使用してcsvへのdfを見つけるとエラーが表示されるため、私は投稿します。
Windowsでフルパスを使用してファイルにエクスポートする例と、ファイルにヘッダーがある場合:
df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True)
スクリプトがutf-8 encodintとタブをセパレータとして使用しているのと同じディレクトリにあるexportフォルダーに保存したい場合の例:
df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')