web-dev-qa-db-ja.com

データフレームがExcelに書き込めるように不正な文字を削除する方法

ExcelWriterを使用してExcelスプレッドシートにデータフレームを書き込もうとしていますが、エラーが返され続けます。

openpyxl.utils.exceptions.IllegalCharacterError

ExcelWriterが気に入らないデータフレームの一部の文字があると思います。データフレームは3つのExcelスプレッドシートから形成されているため、奇妙に思われるため、Excelが気に入らない文字があるかどうかはわかりません。

データフレームを反復処理し、ExcelWriterが気に入らない文字を置き換える方法はありますか?単に削除するだけでも構いません。

データフレームから不正な文字を削除または置き換える最良の方法は何ですか?

18
user4896331

Haipeng Suの回答に基づいて、私はこれを行う関数を追加しました:

dataframe = dataframe.applymap(lambda x: x.encode('unicode_escape').
                 decode('utf-8') if isinstance(x, str) else x)

基本的に、Unicode文字が存在する場合は、それをエスケープします。問題なく動作し、Excelスプレッドシートに再び書き込むことができます!

28
user4896331

同じ問題が私にも起こりました。私はそれを次のように解決しました:

  1. インストールpythonパッケージxlsxwriter:
pip install xlsxwriter
  1. デフォルトのエンジン「openpyxl」を「xlsxwriter」に置き換えます。
dataframe.to_Excel("file.xlsx", engine='xlsxwriter')
12
mathsyouth

別のExcelライターエンジンを試すと、問題が解決しました。

writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter')
12
Jialin Zou

また、データフレームをhtmlまたはcsvに書き込むときに、データフレーム内のいくつかの奇妙な文字と格闘していました。たとえば、アクセント付きの文字の場合、htmlファイルに書き込むことができないため、文字をアクセントなしの文字に変換する必要があります。

私の方法は最善ではないかもしれませんが、unicode文字列をascii互換に変換するのに役立ちます。

_# install unidecode first 
from unidecode import unidecode

def FormatString(s):
if isinstance(s, unicode):
  try:
    s.encode('ascii')
    return s
  except:
    return unidecode(s)
else:
  return s

df2 = df1.applymap(FormatString) 
_

あなたの状況で、return unidecode(s)を_return 'StringYouWantToReplace'_に変更して、不正な文字を単に削除したい場合。

これがあなたの問題に対処するためのいくつかのアイデアを与えてくれることを願っています。

5
Haipeng Su

Excelにエクスポートする前に、データフレームから不正な文字を削除するだけです。

import pandas as pd
import re
import openpyxl
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE


writer = pd.ExcelWriter(myexcelfilepath, engine='openpyxl')

# [optional] avoid pandas.DataFrame.to_Excel overwritting your existing workbook 
workbook = openpyxl.load_workbook(myexcelfilepath)
writer.book = workbook

# replace illegal characters in str or unicode value by '' 
# using the regex ILLEGAL_CHARACTERS_RE string defined in openpyxl.cell.cell module
mydataframe = mydataframe.applymap(
               lambda x: re.sub(ILLEGAL_CHARACTERS_RE, '', x) 
               if isinstance(x, str) or isinstance(x, unicode) else x)

# export your cleaned dataframe to Excel
mydataframe.to_Excel(writer, sheet_name='targetsheetname', index=False)
writer.close()
0
miri

それでもキャラクターのクリーンアップに苦労している場合、これは私にとってうまくいきました:

import xlwings as xw
import pandas as pd
df = pd.read_pickle('C:\\Users\\User1\\picked_DataFrame_notWriting.df')
topath = 'C:\\Users\\User1\\tryAgain.xlsx'
wb = xw.Book(topath)
ws = wb.sheets['Data']
ws.range('A1').options(index=False).value = df
wb.save()
wb.close()
0
REdim.Learning