web-dev-qa-db-ja.com

Python pandas to_Excel 'utf8' codec ca n't decode byte

私はPython pandas=で結果を書き出すのに問題があります。データをCSVファイルとして読み込み、エクスポートしています。各スクリプトは、正常に動作する独自のCSVファイルです。最近、すべてを1つのExcelファイルでワークシートといくつかのシートでエクスポートしようとしてエラーが発生しましたが、

「 'utf8'コーデックは位置1のバイト0xe9をデコードできません:無効な継続バイト」

Excelへのエクスポートで問題が発生する可能性のある文字を見つけ出す方法すらわかりません。なぜそれがうまくCSVにエクスポートするのか分かりませんが:(

関連する行

from pandas import ExcelWriter
data = pd.read_csv(input)
writer = ExcelWriter(output) #output is just the filename
fundraisers.to_Excel(writer, "fundraisers")
locations.to_Excel(writer, "locations") #error
locations.to_csv(outputcsv) #works
writer.save()

問題のあるデータフレームの印刷ヘッド

Event ID    Constituent ID  Email Address   First Name  \   Last Name
f       1       A       A       1
F       4       L       R       C
M       1       1       A       D
F       4       A       A       G
M       2       0       R       G
M       3       O       O       H
M       2       T       E       H
M       2       A       A       H
M       2       M       M       K
F       3       J       E       K
Location ID raised  raised con  raised email
a   0   0   0
a   8   0   0
o   0   0   0
o   0   0   0
o   0   0   0
t   5   0   0
o   1   0   0
o   6   a   0
o   6   0   0
d   0   0   0

excelシートを見ると、実際には部分的に印刷されています。名列以降は空白ですが、イベント、構成要素、および電子メールはすべて印刷されます。

編集:utf8としてcsvを読み込もうとすると失敗しますが、latin1としては読み込めます。 to_Excelエンコーディングを指定する方法はありますか?または、データフレームをutf8にデコードおよびエンコードしますか?

18
Wizuriel

これを解決できました。

文字列を含む列を通過する関数を作成し、それらをutf8にデコード/エンコードすることができました。

def changeencode(data, cols):
    for col in cols:
        data[col] = data[col].str.decode('iso-8859-1').str.encode('utf-8')
    return data   
21
Wizuriel

私の場合、問題は、最初は読み取りエンコードが間違っているCSVファイル(cp1252の代わりにASCII)だったことです。したがって、pandas=がExcelファイルに書き込もうとすると、デコードできない文字が見つかりました。

CSVファイルを読み込むときに正しいエンコードを指定することで解決しました。

data = pd.read_csv(fname, encoding='cp1252')
13
Zenadix

実際、ExcelWriterにパラメーターを渡すことでutf8エンコードを強制する方法があります。

 ew = pandas.ExcelWriter('test.xlsx',options={'encoding':'utf-8'})
 sampleList = ['Miño', '1', '2', 'señora']
 dataframe = pandas.DataFrame(sampleList)
 dataframe.to_Excel(ew)
 ew.save()
5
user3570953

最も簡単なことは、utf-8でデータフレームをロードすることです。その後、ExcelWriterは問題なく保存します。

data = pd.read_csv(path,encoding='utf-8')
2
billmanH

いつリリースされるのかわかりませんが、私のgithubリポジトリで試すことができます:

https://github.com/jtornero/pandas

クローンを作成して、ソースからpandasをビルドできます。問題はほぼ解決されており、次のように機能します。

sampleList = ['Miño', '1', '2', 'señora']
dataframe = pandas.DataFrame(sampleList)
ew = pandas.ExcelWriter('./test.xls', encoding='utf-8')
dataframe.to_Excel(ew)
ew.save()

乾杯

ホルヘ・トルネロ

1
Jorge Tornero

@Zenadixが言ったことと同様に、csvをUTF-8として読み込むことにより、ExcelWriterはエラーなしで書き込むことができました。

df = pd.read_csv('path', encoding='utf-8')

...

with pd.ExcelWriter('new_path') as writer:
    df.to_Excel(writer, sheet_name='Foo')


0
Joe Banks