Pandas DataFrameに、次のようなcsvファイルを読み込んでいます。
A B +--------------+---------------+ 0 | | ("t1", "t2") | +--------------+---------------+ 1 | ("t3", "t4") | | +--------------+---------------+
2つのセルには文字通りのタプルがあり、2つのセルは空です。
df = pd.read_csv(my_file.csv, dtype=str, delimiter=',',
converters={'A': ast.literal_eval, 'B': ast.literal_eval})
コンバーターast.literal_eval
は、コード内でリテラルタプルをPythonタプルオブジェクトに変換するために正常に機能しますが、空のセルがない場合に限ります。空のセルがあるため、次のエラーが発生します。
SyntaxError:解析中に予期しないEOFが発生しました
このS / Oの回答によると、空の文字列のSyntaxError例外をキャッチする必要があります。
astは、compileを使用して、ソース文字列(式である必要があります)をASTにコンパイルします。ソース文字列が有効な式(空の文字列など)でない場合、コンパイルによってSyntaxErrorが発生します。
ただし、のコンテキスト内で、個々のセルの例外をキャッチする方法がわかりませんread_csv
converters
。
これについて行くための最良の方法は何でしょうか?それ以外の場合、空の文字列/セルを、literal_eval
受け入れるか無視するオブジェクトに変換する方法はありますか?
注意:私の理解では、読み取り可能なファイルにリテラルタプルを含めることが常に最善であるとは限りませんが、私の場合は便利です。
ast.literal_eval
条件付きで使用するカスタム関数を作成できます。
from ast import literal_eval
from io import StringIO
# replicate csv file
x = StringIO("""A,B
,"('t1', 't2')"
"('t3', 't4')",""")
def literal_converter(val):
# replace first val with '' or some other null identifier if required
return val if val == '' else literal_eval(val)
df = pd.read_csv(x, delimiter=',', converters=dict.fromkeys('AB', literal_converter))
print(df)
A B
0 (t1, t2)
1 (t3, t4)
または、try
/except
を使用してをキャッチすることもできますSyntaxError
。このソリューションは、それはすなわち、他の不正な構文を扱いますように、より寛大であるSyntaxError
/ValueError
の理由によって引き起こされる他の空の値よりも。
def literal_converter(val):
try:
return literal_eval(val)
except SyntaxError, ValueError:
return val
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加