Pandas: read_csv「CParserError:データのトークン化エラー」と可変数のフィールド

作成日 2015年10月31日  ·  17コメント  ·  ソース: pandas-dev/pandas

380 MB以上のcsvファイルを読み込もうとすると、 read_csv (Pandas 0.17.0)で問題が発生します。 ファイルは54フィールドで始まりますが、一部の行には54ではなく53フィールドがあります。以下のコードを実行すると、次のエラーが発生します。

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
df = pd.read_csv(filename,
                         names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                                'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                                'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                                'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                                'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                                'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                        usecols=range(0, 42),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

エラー:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

error_bad_lines=Falseキーワードを渡すと、次の例のように問題のある行が表示されます。

Skipping line 1683401: expected 53 fields, saw 54

ただし、今回は次のエラーが発生します(DataFrameもロードされません)。

CParserError: Too many columns specified: expected 54 and found 53

engine='python'キーワードを渡してもエラーは発生しませんが、データの解析には非常に長い時間がかかります。 error_bad_lines=Falseが使用されているかどうかに応じて、エラーメッセージで53と54が切り替えられることに注意してください。

IO CSV Usage Question

最も参考になるコメント

これを試して:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

全てのコメント17件

これらのエラーはすべて正しいです。 usecolsnamesを渡すことにより、パーサーが実行していることを制約しています。 これを行わず、解析できるかどうかを確認してください。

複製するファイルのサンプルがなければ、このようなものを診断するのは非常に困難です。

pd.show_versions()も表示します

元のデータファイルの場合:

他のキーワードがないpd.read_csv(filename)は、エラーなしでデータを解析しているようです。 pd.read_csv(filename, header=None)は次のエラーを出します:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

サンプルデータなしで診断することは非常に難しいことに完全に同意しました。 数行のcsvファイル(53フィールド、54フィールド)でエラーを生成しようとしましたが、 pd.read_csvは期待どおりにNaNでギャップを埋めます。 usecolsheader=Noneを渡して繰り返しましたが、まだ機能します。 元のファイルには、すべてのエラーを引き起こす何らかの問題があるようです。

pd.show_versions()出力は次のとおりです。

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

列数は最初の行から推測されるため、が予想されます。 namesを渡すと、これを決定機能として使用します。

だから、さまざまなオプションを試してみてください。 namesusecolsて、実際には少し制約しています。 それを読んでから、必要なものにインデックスを付け直す方がよいかもしれません。

engine='python'が使用されている場合、不思議なことに、問題なくDataFrameをロードします。 次のスニペットを使用して、ファイルの最初の3行と問題のある3行を抽出しました(エラーメッセージから行番号を取得しました)。

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

1〜3行目:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

問題のある行:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

あなたが提案したように、私はファイルを読み取ってからDataFrameを変更する(列の名前を変更する、不要な列を削除するなど)か、単にpythonエンジンを使用します(長い処理時間)。

さらに調査すると、次の一連のコマンドが機能します(データの最初の行が失われます- header=None存在し

df = pd.read_csv(filename, 
                 usecols=range(0, 42))
df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

以下は機能しません

df = pd.read_csv(filename,
                 names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                 usecols=range(0, 42))

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

以下は機能しません

df = pd.read_csv(filename,
                 header=None)

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

使用法の質問として終了します。

dic_df = _create_init_dic( "C:/ Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA.csv")
ParserError:データのトークン化中にエラーが発生しました。 Cエラー:33行目に1つのフィールドが必要で、3が表示されました

これを試して:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

それを試して、同様のエラーのために働いてくれてありがとう!

読んだらquoting=3追加してみてください

パンダがより多くのフィールドを持つ行の余分なフィールドを無視する方法はありますか?
たとえば、「1605634行で53フィールドが予想され、54行目」の場合
1605634行のフィールド54をドロップするだけです

別のケース! しかし、「error_bad_lines = False」で解決され、それでもエラーが出力されますが、「終了コード0」

同じエラーが発生しました

read_csvモードで区切り文字パラメーターを追加するだけです

そしてそれはうまくいった

error_bad_lines = False
できます

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

列数は最初の行から推測されるため、が予想されます。 namesを渡すと、これを決定機能として使用します。

だから、さまざまなオプションを試してみてください。 namesusecolsて、実際には少し制約しています。 それを読んでから、必要なものにインデックスを付け直す方がよいかもしれません。

これはうまくいきます! R言語を使用してcsvを作成し、Pythonで読み取ろうとしています。 最初の行は、すべての行の最大長である必要があります。 この方法は、不良ラインの問題を修正し、ラインを失うことはありません。

コマンドpd.read_csvを使用して.xlsxファイルをインポートしようとすると、このエラーが発生します。

pd.read_csvの代わりにpd.read_excelを使用してみてください

これを修正する最も簡単な方法は、CSVファイルをExcelファイルに変換し、データの読み取りにpd.read_csvではなくpd.read_excelを使用することです。

このページは役に立ちましたか?
0 / 5 - 0 評価