web-dev-qa-db-ja.com

Python Pandas Errorデータのトークン化

パンダを使用して.csvファイルを操作しようとしていますが、このエラーが発生します。

pandas.parser.CParserError:データのトークン化エラーCエラー:3行目に2フィールドあり、12を見た

私はパンダのドキュメントを読もうとしましたが、何も見つかりませんでした。

私のコードは簡単です:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

どうすればこれを解決できますか? csvモジュールまたは他の言語を使うべきですか?

ファイルは Morningstar からです。

232
abuteau

あなたも試すことができます。

data = pd.read_csv('file1.csv', error_bad_lines=False)

これにより、問題の行がスキップされることに注意してください。

346
richie

それは問題になるかもしれません

  • データ内の区切り文字
  • @TomAugspurgerが指摘したように、最初の行

これを解決するには、read_csvを呼び出すときにsepまたはheader、あるいはその両方の引数を指定してみてください。例えば、

df = pandas.read_csv(fileName, sep='delimiter', header=None)

上記のコードでは、sepが区切り文字を定義し、header=Noneがソースデータにヘッダー/列タイトルの行がないことをパンダに伝えます。したがって、saith the docs : "fileにヘッダ行が含まれていない場合は、header = Noneを明示的に渡す必要があります。"この例では、パンダは各フィールド{0,1,2、...}に対して整数のインデックスを自動的に作成します。

文書によると、区切り文字は そうではない 問題になるはずです。文書は、「sepがNone(指定されていない)の場合、これを自動的に決定しようとします」と述べています。しかしながら、私は明らかな区切り文字を持つインスタンスを含めて、これにはうまくいきませんでした。

60
grisaitis

パーサーはファイルのヘッダーに混乱しています。最初の行を読み取り、その行から列数を推測します。しかし、最初の2行はファイル内の実際のデータを表していません。

data = pd.read_csv(path, skiprows=2)で試してください

32
TomAugspurger

CSVファイルの列数が可変で、read_csvが最初の数行から列数を推測した可能性があります。この場合それを解決する2つの方法:

1)CSVファイルを変更して、最大列数を持つダミーの最初の行を含めます(そしてheader=[0]を指定します)

2)またはnames = list(range(0,N))を使用します。ここで、Nは最大列数です。

26
computerist

私もこの問題を抱えていましたが、おそらく別の理由によるものです。私のCSVには、パンダが読み込もうとしている列を追加している末尾のカンマがいくつかありました。次のように動作しますが、単に悪い行を無視します。

data = pd.read_csv('file1.csv', error_bad_lines=False)

エラーを処理するために行を醜い種類のハックにしたい場合は、次のようなことをします。

line     = []
expected = []
saw      = []     
cont     = True 

while cont == True:     
    try:
        data = pd.read_csv('file1.csv',skiprows=line)
        cont = False
    except Exception as e:    
        errortype = e.message.split('.')[0].strip()                                
        if errortype == 'Error tokenizing data':                        
           cerror      = e.message.split(':')[1].strip().replace(',','')
           nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
           expected.append(int(nums[0]))
           saw.append(int(nums[2]))
           line.append(int(nums[1])-1)
         else:
           cerror      = 'Unknown'
           print 'Unknown Error - 222'

if line != []:
    # Handle the errors however you want

上記のコードでは、不正な行が変数 'line'によって指定されるため、行をDataFrameに再挿入するスクリプトを作成しました。これはすべてcsvリーダーを使用することで回避できます。うまくいけば、パンダの開発者は将来的にこの状況に対処することが容易にできるようになることができます。

15
Robert Geiger

Csv CSVのほとんどはsep='/t'を使用して作成されるので、これは間違いなく区切り文字の問題です。したがって、区切り文字read_csvを使用してタブ文字(\t)を使用して/tを試してください。だから、次のコード行を使って開くようにしてください。

data=pd.read_csv("File_path", sep='\t')
14

私はこの問題を私自身で数回経験しました。ほとんどの場合、その理由は、開こうとしていたファイルが最初から正しく保存されたCSVではなかったことです。そして、「正しく」とは、各行が同じ数の分離文字または列を持つことを意味します。

通常、私はExcelでCSVを開いてから不適切に保存したために起こりました。ファイル拡張子はまだ.csvですが、純粋なCSV形式は変更されています。

Pandas to_csvで保存されたファイルは正しくフォーマットされ、その問題はありません。しかし、あなたが他のプログラムでそれを開くと、それは構造を変えるかもしれません。

それが役立つことを願っています。

9
elPastor

私は同じ問題に遭遇しました。同じソースファイルでpd.read_table()を使用してもうまくいくようです。私はこの理由を突き止めることができませんでしたが、それは私の場合のための有用な回避策でした。おそらく、もっと知識のある人が、なぜそれがうまくいったのかをより明確にすることができます。

編集:私はあなたが実際のデータと同じ形式を持っていないあなたのファイルにいくつかのテキストがあるときにこのエラーが忍び寄ることがわかりました。これは通常、ヘッダーまたはフッターの情報(1行を超えるため、skip_headerは機能しません)であり、実際のデータと同じ数のコンマで区切られることはありません(read_csvを使用する場合)。 read_tableを使用すると、タブを区切り文字として使用するため、ユーザーの現在のエラーを回避できますが、他のエラーが発生する可能性があります。

通常、余分なデータをファイルに読み込んでからread_csv()メソッドを使用することでこれを回避します。

実際のファイルによって正確な解決策は異なるかもしれませんが、このアプローチはいくつかのケースで私のために働いています

7
Legend_Ari

スペース、カンマ、引用符でタブ区切りのテーブルを読み込もうとしたときにも、同様の問題がありました。

1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""



import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

これはC構文解析エンジン(デフォルトのもの)と関係があるということです。たぶんpythonに変更すると何でも変わるでしょう

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

これは別のエラーです。
先に進んでテーブルからスペースを削除しようとすると、python-engineからのエラーがもう一度変わります。

1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""


_csv.Error: '   ' expected after '"'

そして、パンダが私たちの行を解析するのに問題を抱えていたことは明らかです。 Pythonエンジンでテーブルを解析するには、テーブルからすべてのスペースと引用符を削除する必要があります。その間、Cエンジンはコンマが連続していてもクラッシュし続けました。

私のテーブルは小さいので、私はこれをした新しいファイルを作成して置き換えることを避けます:

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

tl; dr
解析エンジンを変更し、データ内の区切り文字のない引用符/カンマ/スペースを避けてください。

5
lotrus28

次の一連のコマンドが動作します(データの最初の行を失います-no header = None present-が、少なくともロードされます)。

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:データのトークン化エラーCエラー:1605634行目に53個のフィールドが予想され、54個が表示されました。

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

CParserError:データのトークン化エラーCエラー:1605634行目に53フィールドあり、54を見た

したがって、あなたの問題ではusecols=range(0, 2)を渡さなければなりません

3
kepy97

この質問には当てはまりませんが、このエラーは圧縮データでも発生する可能性があります。 kwargcompressionの値を明示的に設定することで私の問題は解決しました。

result = pandas.read_csv(data_source, compression='gzip')

パラメータに区切り文字を使用

pd.read_csv(filename, delimiter=",", encoding='utf-8')

読みます。

2
Bhavesh Kumar

私が使用したデータセットには、多くの引用符( ")がフォーマットの外部を使用していました。read_csv()にこのパラメーターを含めることで、エラーを修正できました。

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas
2
user3426943

私は列名を渡さずにCSVを読み込もうとしていたこの問題を抱えていました。

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

リストで列名を事前に指定してからnamesに渡してすぐに解決しました。列名を設定していない場合は、データに含まれる可能性のある最大列数と同じ数のプレースホルダ名を作成するだけで済みます。

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
2
Steven Rouk

私が似たような構文解析エラーに対処するのに役立つことがわかった代替手段はCSVモジュールを使ってデータをパンダdfに再ルーティングすることです。例えば:

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

私はCSVモジュールがフォーマットが不十分なカンマ区切りのファイルに対してもう少し堅牢であると思うので、このような問題に対処するためにこのルートで成功しました。

2
bcoz

これが私がしたことです。

sep='::'は私の問題を解決しました:

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')
2

pandas.read_csv('CSVFILENAME',header=None,sep=', ')を使う

リンクからcsvデータを読み込もうとしたとき

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

サイトから自分のcsvファイルにデータをコピーしました。余分なスペースがあったのでsep = '、'を使用しました、そしてそれはうまくいきました:)

2
Abhishek

時々問題はpythonの使い方ではなく、生データの使い方です。
このエラーメッセージが出ました

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

列の説明にはコンマが含まれることがありました。つまり、CSVファイルをクリーンアップするか、別のセパレータを使用する必要があります。

2
Kims Sifers

Read_csv:ParserError:データのトークン化時にエラーが発生しました。古いcsvファイルを新しいcsvファイルに保存しました。問題は解決しました!

1
Simin Zuo

私はこれと同じようなケースがありました

train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

働いた

1
Adewole Adesola

既存の行番号を持つデータセットがあり、index_colを使用します。

pd.read_csv('train.csv', index_col=0)
1
user260826

問題はファイルの問題にある可能性があります。私の場合、問題はファイルの名前を変更した後に解決されました。理由はまだわかりません。

0
SQA_LEARN

有用な答えのほとんどはすでに述べていますが、pandasデータフレームを寄木細工のファイルとして保存することをお勧めします。寄木細工のファイルにはこの問題はなく、同時にメモリ効率も高くなります。

0
Bikash Joshi

あなたは問題を回避するためにこのステップをすることができます -

train = pd.read_csv('/home/Project/output.csv' , header=None)

追加するだけです - header=None

お役に立てれば!!

0
rahul ranjan

私はこのエラーに曖昧な引用符で遭遇しました。コンマ区切りファイルをエクスポートするときにテキスト項目の周囲に引用符を付けるマッピングソフトウェアを使用します。引用符を使用するテキスト(例: '= feet and "= inch)は問題になる可能性があります。この例では、5インチのウェルログの印刷は不適切であることがわかります。

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

5"の省略形として5 inchを使用すると、作品にレンチが投げ込まれてしまいます。 Excelは余分な引用符を単純に削除しますが、Pandasは上記のerror_bad_lines=False引数がないと分割します。

0
Andrew Silver

私は同様のエラーがありました、そして、問題は私が私のcsvファイルでエスケープ引用符をいくつか持っていて、escapecharパラメータを適切に設定する必要があるということでした。

0
jvvw

以下は私のために働いた(Google Colaboratory Notebookでこの問題を特に抱えていたので、私はこの答えを投稿した):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
0
Dirk

私はこのエラーに曖昧な引用符で遭遇しました。コンマ区切りファイルをエクスポートするときにテキスト項目の周囲に引用符を付けるマッピングソフトウェアを使用します。引用符を使用するテキスト(例: '= feet and "= inch)は問題になる可能性があります。この例では、5インチのウェルログの印刷は不適切であることがわかります。

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

5"の省略形として5 inchを使用すると、作品にレンチが投げ込まれてしまいます。 Excelは余分な引用符を単純に削除しますが、Pandasは上記のerror_bad_lines=False引数がないと分割します。

エラーの性質がわかったら、インポートの前にテキストエディタ(Sublime Text 3やNotepad ++など)からFind-Replaceを実行するのが最も簡単な場合があります。

0
Andrew Silver

私にとっての問題は、新しい列が私のCSV intradayに追加されたことです。 error_bad_lines=Falseを使用した場合、受け入れられた回答ソリューションは every future行として破棄されません。

この場合の解決策は、pd.read_csv()usecols パラメータを使うことでした。こうすれば、CSVに読み込む必要がある列のみを指定でき、ヘッダー列が存在する限り(および列名は変更されない限り)、私のPythonコードは将来のCSVの変更に対して耐性があります。

usecols : list-like or callable, optional 

Return a subset of the columns. If list-like, all elements must either
be positional (i.e. integer indices into the document columns) or
strings that correspond to column names provided either by the user in
names or inferred from the document header row(s). For example, a
valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar',
'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1,
0]. To instantiate a DataFrame from data with element order preserved
use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for
columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.

my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)

これのもう1つの利点は、18〜20列のCSVの3〜4列しか使用していない場合に、メモリにロードできるデータ量が少ないことです。

0
Scott Skiles