web-dev-qa-db-ja.com

PandasがデータファイルをCSVファイルに書き込む

私は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'メソッド(私は存在しないと思う)?

521
user7289

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

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

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

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

to_csvメソッドを使用してDataFramename__オブジェクトをcsvファイルに格納する場合、おそらくDataFramename__の各先行インデックスを格納する必要はないでしょう。オブジェクト.

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

やや似ている:

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

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

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

あなたが '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
15
Glen Thompson

あなたがインデックスが欲しくないならば。

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

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

8

それはこの場合の答えではないかもしれないが、私はと同じエラーメッセージを持っていたように .to_csv 私は試した .toCSV( 'name.csv') エラーメッセージが異なりました( "'SparseDataFrame'オブジェクトには属性 'toCSV'"がありません)。データフレームを密なデータフレームに変えることで問題は解決しました

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

パンダDataFrameをCSVファイルに書き込むには、 DataFrame.to_csv が必要になります。この関数は、あなたが特定のユースケースに合うためにオーバーライドする必要がないより合理的なデフォルトで多くの引数を提供します。たとえば、書き込み時に別の区切り記号を使用したり、日時書式を変更したり、索引をドロップしたりすることができます。 to_csvには、これらの要件に対処するために渡すことができる引数があります。

CSVファイルへの書き込みに関する一般的なシナリオとそれに対応する引数をリストした表があります。

Write to CSV ma dude

脚注

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

Csvへの単純なデータフレームの場合..あなたの質問の答えにも存在します。これは上記のエラーの答えではありません

df.to_csv('output.csv')

上記の回答を使用してcsvへのdfを見つけるとエラーが表示されるため、私は投稿します。

0
Alkesh Mahajan

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')
0
Harvey